有没有办法在列表中声明一堆变量,然后在for循环中定义它们呢?
myList = [a,b,c,d]
for var in myList:
var = 1
这样a,b,c和d都会以1结尾?现在,如果我尝试运行此代码,我会收到一条错误,告诉我“a未定义”。
答案 0 :(得分:2)
我认为最好使用字典来制作你想要的东西。
>>> 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'])
答案 1 :(得分:1)
这几乎总是一个非常糟糕的主意,但如果你必须这样做,你可以这样做:
首先,您需要将变量的名称放在列表中,而不是变量本身。正如错误告诉您的那样,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
和朋友(或类似地,setattr
和朋友)时,你就不得不退回一个级别,并开始混淆变量名称作为字符串。
偶尔有充分理由这样做(setattr
比globals
更常见),但它们并不常见。每当你想你想要这个时,第一步应该是问自己(或其他人)是否有更好的方法来解决你的实际问题所以不需要它。