使用循环为列表中的变量赋值
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
当前名称的名称。
同样,当您创建列表时,如果 one
、two
和 three
还不是值的名称,那么您不能这样使用它们,因为您要求创建一个列表具有这些名称的值(然后导致 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]
时,您将在创建变量one
、two
和three
之前引用它们。
【讨论】:
以上是关于使用循环为列表中的变量赋值的主要内容,如果未能解决你的问题,请参考以下文章