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

17 投票
5 回答
99296 浏览
提问于 2025-04-16 09:56
var_list = [one, two, three]
num = 1
for var in var_list:
    var = num
    num += 1

上面的代码给我报错,说'one'这个变量不存在。这样赋值是不行的吗?我想给列表里的每个变量分配一个递增的数字。所以我想要的是

one = 1
two = 2
three = 3

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

5 个回答

7

不,这样是行不通的。

你可以试试:

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

这个方法是通过在一次赋值中定义多个变量来实现的。就像你可以写 a, b = 1, 2 一样。这会展开 range 的值,并把这些值赋给左边的变量,所以看起来就像你的循环(不过这个是有效的)。

还有一种选择(我不建议在真正的程序中使用……)是通过 exec 语句引入变量名:

names = ['one', 'two', 'three']
num = 1
for name in names:
    exec "%s = %s" % (name, num)
    num += 1
print one, two, three                  
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 成为这个列表的名字)。需要注意的是,列表也并不是真正包含这些值:它只是引用了这些值,也就是说,它与这些值是共享的。

撰写回答