动态变量名赋值
使用情形下会需要向着动态的方向去生成变量, 就像去生成var1这样的变量到var10这样的变量一样。
使用exec动态赋值
exec在中是内置函数,它支持代码的动态执行。
示例:
In[1]:foriinrange(5): ...:exec('var{}={}'.format(i,i)) ...: In[2]:print(var0,var1,var2,var3,var4) 01234利用命名空间动态赋值
在的命名空间中,将变量名与值存储在字典中,
可以通过(),()函数分别获取局部命名空间和全局命名空间。
示例
>>>names=locals() >>>foriinrange(5): ...names['n'+str(i)]=i ... >>>print(n0,n1,n2,n3,n4) 01234 >>>
在类中使用动态变量
类对象所拥有的属性, 被存储于其中。其是这样一种存在, 它是一本词典, 词典里的键是属性的名称, 而对应键的值, 便是属性实际对应的值。
示例
>>>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利用命名空间
正是由于命令空间的()以及()都会去返回一个字典, 借助字典的get方法拿来获取变量的值。
In[4]:names=locals() In[5]:foriinrange(5): ...:print(names.get('var'+str(i)),end='') ...: 01234下面是其他网友的补充
定义动态变量
问题描述
在进行数据处理期间, 针对那些通过分组而得到的数据, 所开展的操作大致都是相似的, 变量的命名均具备相同的结构, 举例来说, 针对每个月份的数据计算均值、方差等统计量, 变量的命名可以设定为“n月的均值”, “n月的方差”, 经过抽象提炼便是“n月的'm统计量'”。
实现编程的时候, 上述变量的定义能实现, 对其引用也能实现, 二者一同实现, 减少了重复代码数量。
实现的时候遇到了动态定义变量的问题,这里总结一下
利用exec动态定义变量
我们可以如此动态定义变量
forninrange(1,13): exec('month_{}={}'.format(n,valueorexpression))正常来讲, 这种语句通常能够正确地对变量进行定义, 然而, 有的时候, 上述语句会出现差错, 举例来说, 当后方传入的内容为返回一个类变量的情况时, 就会产生语法方面的错误。
File"",line1
=
:
何种缘由尚不清楚, 经历一番查找之后, 我察觉到存在另外一种界定方式, 能够将上述难题予以处理。
forninrange(1,13): exec('month_{}=temp'.format(n),{'temp':expression})这种方法有两个问题:
1、通过利用进行替换的部分要处于变量名的最末尾之处, 比如{}, 这样才能够执行成功, 然而{}这一情况却是不可行的, 其中缘由有待查找...还请各位同学给予指点!
File"",line1
=temp
:
2、变量由这种方法所定义, 仅于exec里具备效力, 于exec语句之外就不生效, 这大概是由于把exec当中繁杂的指令视作局部变量了, 能够借助以下语句来开展检验。
forninrange(1,13): exec('month_{}=temp\nprint(locals()==globals())'.format(n),{'temp':expression})其中, ()跟()属于是的内在方法, 它们给出了依靠字典的途径来访问局部以及全局变量。
若是返回True, 表明当下环境处在全局级别, 于exec里的语句能够在exec之外生效。
要是返回False, 那就表明当期的环境处在局部级别, 所定义的变量被看成是局部变量, 因而没办法在exec之外进行调用, 能够往语句里传入()叫它于全局生效。
forninrange(1,13): exec('month_{}=temp'.format(n),{'temp':expression},globals())exec这种方式极易变得混乱不堪, 存在着另外一种能够动态定义变量的办法, 也就是刚才上面提及到的那种, 是()的方法以及()的方法。
利用命名空间动态定义变量
首先创建()的副本
=()
对于上文提到的变量便可如此定义
forninrange(1,13): varDict['month_'+str(n)]=valueorexpression
用这种方式创建的变量, 不会出现第一种方式里那种语法错误以及变量作用域的错误, 很值得去推荐!