Python 动态变量名定义与调用方法
动态变量名赋值
在使用tkinter时需要动态生成变量,如动态生成var1...var10变量。
使用exec动态赋值
exec在python3中是内置函数,它支持python代码的动态执行。
示例:
In[1]:foriinrange(5): ...:exec('var{}={}'.format(i,i)) ...: In[2]:print(var0,var1,var2,var3,var4) 01234
利用命名空间动态赋值
在Python的命名空间中,将变量名与值存储在字典中,
可以通过locals(),globals()函数分别获取局部命名空间和全局命名空间。
示例
>>>names=locals() >>>foriinrange(5): ...names['n'+str(i)]=i ... >>>print(n0,n1,n2,n3,n4) 01234 >>>
在类中使用动态变量
Python的类对象的属性储存在的__dict__中。__dict__是一个词典,键为属性名,值对应属性的值。
示例
>>>print(n0,n1,n2,n3,n4) 01234 >>>classTest_class(object): ...def__init__(self): ...names=self.__dict__ ...foriinrange(5): ...names['n'+str(i)]=i ... >>>t=Test_class() >>>print(t.n0,t.n1,t.n2,t.n3,t.n4) 01234
调用动态变量
事实上,对于重复性的变量,我们一般不会这样调用变量,如:var0,var1,var2,var3,var4....varN,可以利用下面方法动态调用变量。
先定义如下变量:
示例
>>>foriinrange(5): ...exec('var{}={}'.format(i,i)) ... >>>print(var0,var1,var2,var3,var4) 01234
利用exec函数
同样地,可以使用exec调用变量
In[3]:foriinrange(5): ...:exec('print(var{},end="")'.format(i)) ...: 01234
利用命名空间
因为命令空间的locals()与globals()均会返回一个字典,利用字典的get方法获取变量的值
In[4]:names=locals() In[5]:foriinrange(5): ...:print(names.get('var'+str(i)),end='') ...: 01234
下面是其他网友的补充
Python定义动态变量
问题描述
在做数据处理时,对一些分组得来的数据,所做的操作大同小异,变量的命名也都拥有相同的结构,比如对每个月份的数据求均值、方差等统计量,变量的命名可取为“n月的均值”,“n月的方差”,抽象出来就是“n月的'm统计量'”
在编程实现的时候,对上述变量的定义以及引用,都可以一同实现,从而减少了重复代码的数量
实现的时候遇到了动态定义变量的问题,这里总结一下
利用exec动态定义变量
我们可以如此动态定义变量
forninrange(1,13): exec('month_{}={}'.format(n,valueorexpression))
一般这种语句都可以正确定义变量,但有时上述语句会出错,比如后方传入的expression返回一个DataFrameGroupBy类变量时,会出现语法错误
File"
",line1
month_12=
^
SyntaxError:invalidsyntax
原因未明...经过搜索,我发现还有另一种定义方法,可以解决上述问题
forninrange(1,13): exec('month_{}=temp'.format(n),{'temp':expression})
这种方法有两个问题:
1、利用format替换的部分需在变量名的最后方,例month_{},方可执行成功,而{}_month便不可行,原因待查...还请各位同学指点!
File"
",line1
12_month=temp
^
SyntaxError:invalidtoken
2、这种方法定义的变量,只在exec中有效,在exec语句外便无效,这或许是因为python将exec中复杂的指令当做了局部变量,可以在利用以下语句检验
forninrange(1,13): exec('month_{}=temp\nprint(locals()==globals())'.format(n),{'temp':expression})
其中locals()与globals()是python的内部方法,它们提供了基于字典的访问局部与全局变量的方式。
如果返回True,说明当前环境处于全局级别,在exec中的语句可以在exec外生效
如果返回False,说明当期环境处于局部级别,定义的变量被看做局部变量,所以不能在exec外调用,可以在语句中传入globals()使其在全局生效
forninrange(1,13): exec('month_{}=temp'.format(n),{'temp':expression},globals())
exec方式太容易混乱,还有另外一种动态定义变量的方法,便是上文提到的globals()与locals()方法
利用命名空间动态定义变量
首先创建locals()的副本
varDict=locals()
对于上文提到的变量便可如此定义
forninrange(1,13): varDict['month_'+str(n)]=valueorexpression
这种方法创建的变量不会出现第一种方法中语法错误与变量作用域的错误,推荐!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。