有没有办法在列表中声明一堆变量,然后像这样在 for 循环中定义它们?
myList = [a,b,c,d]
for var in myList:
var = 1
所以 a、b、c 和 d 最终都会为 1?现在,如果我尝试运行此代码,我会收到一条错误消息,告诉我“a 未定义”。
有没有办法在列表中声明一堆变量,然后像这样在 for 循环中定义它们?
myList = [a,b,c,d]
for var in myList:
var = 1
所以 a、b、c 和 d 最终都会为 1?现在,如果我尝试运行此代码,我会收到一条错误消息,告诉我“a 未定义”。
我认为最好使用字典来满足您的需求。
>>> my_vars = {'a': 1, 'b': 1, 'c': 1, 'd': 1}
>>> print my_var['a']
>>> 1
或者my_vars = dict((x, 1) for x in ['a', 'b', 'c', 'd'])
这几乎总是一个非常糟糕的主意,但如果你必须这样做,你可以这样做:
首先,您需要将变量的名称放在列表中,而不是变量本身。正如错误告诉您的那样,a
尚未定义,因此您不能将其放入列表中。而且,即使它已定义,您也只是将值a
放入列表中,这对您没有帮助。所以:
myList = ['a', 'b', 'c', 'd']
然后,您只需要将它们添加到全局变量(或局部变量、内置函数或您当前定义的类等,具体取决于您尝试在哪个命名空间中定义它们)。
for var in myList:
globals()[var] = 1
如果您想动态访问变量,您将需要相同的技巧来使用您刚刚定义的变量。何必?把它们放在字典里:
myDict = {var: 1 for var in myVars}
或者也许是一个自定义对象,或者一个namedtuple
:
myNames = namedtuple('namespace', myList)(1 for _ in myList)
然后您可以通过以下方式访问它们:
myDict['a']
myNames.a
如果您试图使它们成为变量,则将其与您必须做的比较:
globals()['a']
如果您只是在寻找一种更简洁的方式来静态声明它们,那么这显然无济于事。将三行复杂代码与普通版本进行对比:
a = b = c = d = 1
确实,每当您必须使用globals
and friends(或者,类似地,setattr
and friends)时,您都被迫退后一步,并开始将变量名混合为字符串。
偶尔会有很好的理由这样做(更多的是 forsetattr
比 for globals
),但它们并不常见。每当您认为自己想要这个时,第一步应该是问自己(或其他人)是否有更好的方法来解决您的实际问题,因此不需要它。