使用循环将值赋给列表中的变量

17
var_list = [one, two, three]
num = 1
for var in var_list:
    var = num
    num += 1
上述代码会提示错误,指出'one'不存在。不能用这种方式进行赋值吗?我想为列表中的每个变量分配一个递增的数字。因此,我需要以下等效代码:
one = 1
two = 2
three = 3

但不必手动创建和初始化所有变量,我该怎么做呢?


对于后来查看这个问题的人:很有可能你问题的最合适解决方案就在 https://dev59.com/s3M_5IYBdhLWcg3wcSx_ 。如果你发现自己想要进行这种赋值操作,那么很可能是因为你现有的变量布局不当(或者你想要创建的新变量不能按照你想要的方式进行创建)。 - Karl Knechtel
5个回答

30

您可以使用内置函数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

推荐阅读


13

Python变量是值的名称,它们并没有真正“包含”这些值。

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

同样地,当你创建列表时,如果onetwothree不是已经存在的值名称,那么就不能像那样使用它们,因为你要求创建一个具有这些名称的值的列表(然后使var_list成为该列表的名称)。请注意,该列表也没有真正包含这些值:它引用(即共享)它们。


7
不,它不是这样运作的。
您可以尝试:
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                  

1
这个代码可以运行,但是这个回答没有详细说明为什么 OP 的方式不行。 - John

5

在创建变量之前,变量是不存在的。仅仅引用一个变量并不足以创建它。当你执行[one, two, three]时,你在引用还未被创建的变量onetwothree


0
我会简单地使用列表推导式。
one, two, three = range(1, 4)
one, two, three = [val for val in ['one', 'two', 'three']]
v1, v2, v3 = [func(idx) for idx in range(1, 4)] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接