在列表中声明变量,但在循环中定义它们?

时间:2013-05-22 16:53:22

标签: python python-2.7

有没有办法在列表中声明一堆变量,然后在for循环中定义它们呢?

myList = [a,b,c,d]

for var in myList:
var = 1

这样a,b,c和d都会以1结尾?现在,如果我尝试运行此代码,我会收到一条错误,告诉我“a未定义”。

2 个答案:

答案 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和朋友)时,你就不得不退回一个级别,并开始混淆变量名称作为字符串。

偶尔有充分理由这样做(setattrglobals更常见),但它们并不常见。每当你你想要这个时,第一步应该是问自己(或其他人)是否有更好的方法来解决你的实际问题所以不需要它。