2011-01-14 107 views
7
var_list = [one, two, three] 
num = 1 
for var in var_list: 
    var = num 
    num += 1 

上面的代码给出了'one'不存在的错误。你不能以这种方式分配吗?我想为列表中的每个变量分配一个递增数字。使用循环将值赋给列表中的变量

回答

8

Python变量是名称为值。他们并不真正“包含”这些价值观。

for var in var_list:使'var'成为列表中每个元素的名称。在循环内部,var = num不会影响列表:相反,它会导致var不再是列表元素的名称,而是开始为当前名称的任何名称创建名称。

同样,当你创建列表,如果onetwothree尚未对价值观的名字,那么你可以不使用它们那样的,因为你问到创建具有这些值的列表名称(然后导致var_list成为该列表的名称)。请注意,该列表并不包含这些值,它们是:引用,即共享它们。

4

不,它不能这样工作。

你可以试试:

one, two, three = range(1, 4) 

这项工作通过定义在多任务的变量。就像你可以使用a, b = 1, 2一样。这将展开range并将其值分配给LHS变量,因此它看起来像您的循环(除了它的工作原理)。

另一种选择(我不会在一个真正的程序...推荐)将引入一个exec语句中的变量名:

names = ['one', 'two', 'three'] 
num = 1 
for name in names: 
    exec "%s = %s" % (name, num) 
    num += 1 
print one, two, three     
+0

这工作,但这个答案是为什么有点短OP的方式*不工作。 – John 2011-01-14 04:09:30

+0

的确如此。正如其他人已经介绍的那样,我会解释为什么这是基于此。 – TryPyPy 2011-01-14 04:10:53

2

,直到你创建它变量不存在。仅仅引用一个变量不足以创建它。当您做[one, two, three]时,您在创建之前引用变量one,twothree

8

您可以通过globals()内置函数访问全局变量字典。这本词典使用串钥匙,这意味着,你可以创建在运行时给出的字符串名称变量,像这样:

>>> var_names = ["one", "two", "three"] 
>>> count = 1 
>>> for name in var_names: 
... globals()[name] = count 
... count += 1 
... 
>>> one 
1 
>>> two 
2 
>>> three 
3 
>>> globals()[raw_input()] = 42 
answer 
>>> answer 
42 

Recommended reading