0

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

myList = [a,b,c,d]

for var in myList:
var = 1

所以 a、b、c 和 d 最终都会为 1?现在,如果我尝试运行此代码,我会收到一条错误消息,告诉我“a 未定义”。

4

2 回答 2

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'])

于 2013-05-22T17:08:19.267 回答
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

确实,每当您必须使用globalsand friends(或者,类似地,setattrand friends)时,您都被迫退后一步,并开始将变量名混合为字符串。

偶尔会有很好的理由这样做(更多的是 forsetattr比 for globals),但它们并不常见。每当您认为自己想要这个时,第一步应该是问自己(或其他人)是否有更好的方法来解决您的实际问题,因此不需要它。

于 2013-05-22T17:26:40.547 回答