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

Posted

技术标签:

【中文标题】使用循环为列表中的变量赋值【英文标题】:Assigning values to variables in a list using a loop 【发布时间】:2011-06-08 21:52:44 【问题描述】:
var_list = [one, two, three]
num = 1
for var in var_list:
    var = num
    num += 1

上面给了我一个“一个”不存在的错误。不能这样赋值吗?我想为列表中的每个 var 分配一个递增的数字。所以我想要相当于

one = 1
two = 2
three = 3

但无需手动创建和初始化所有变量。我该怎么做?

【问题讨论】:

对于后来发现这个问题的人:很有可能最适合您的问题的解决方案位于***.com/questions/1373164/…。如果您发现自己想要进行这种分配,可能是因为您现有的变量布局不当(或者您要创建的新变量不应该按照您的想法进行)。 【参考方案1】:

您可以使用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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

不,这样不行。

你可以试试:

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                  

【讨论】:

这行得通,但这个答案对于为什么 OPs 方式 不起作用 起作用有点短。【参考方案4】:

变量在您创建之前不存在。仅仅引用一个变量并不足以创建它。当您执行[one, two, three] 时,您将在创建变量onetwothree 之前引用它们。

【讨论】:

以上是关于使用循环为列表中的变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

python对多个变量循环赋值

第五周小总结

sql2000 取出每行数据,并赋值给变量。

从变量的前缀列表中为变量赋值

SHELL脚本进阶

python 列表切片赋值