我想做以下事情:
a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
i = 6
所需的结果是a = 6
实际结果为a = 1
我猜测没有某种执行官就没有办法做到这一点。正确的吗?
答案 0 :(得分:7)
最初我误解了你的问题,我看到那种善意做对了。但我认为这个问题需要更详细地解释Python的工作原理。在Python中考虑变量的最佳方法是将变量名称视为附加了箭头,将值视为这些箭头指向的对象。变量名称指向对象。所以当你这样做时:
a = 1
你真的说“a
指向1
”。当你这样做时:
b = a
你真的说“b
指向与a
相同的对象”。一般情况下,变量不能指向另一个变量名;它只能指向另一个变量指向的同一个对象。所以当你这样做时:
tom = [a, b, c]
您没有创建指向变量名称 a
,b
和c
的列表;您创建的列表指向与a
,b
和c
相同的对象。如果您更改a
点的位置,则对tom[0]
点的位置没有影响。如果您更改tom[0]
点的位置,则对a
点的位置没有影响。
现在,正如其他人所指出的,你可以以编程方式改变变量名的值,使用exec
建议(不推荐),或者通过改变{{1} (也不推荐)。但大部分时间,这都是不值得的。
如果你真的想这样做,我的建议就是简单地使用字典(如DzinX所建议的那样),或者,对于一个更接近问题精神的解决方案,并且仍然相当干净,你可以简单地使用一个可变对象。然后您可以使用globals()
和getattr
以编程方式更改该对象的属性,如下所示:
setattr
通常,最好的解决方案是使用字典。但偶尔也会出现以上情况更好的情况。
答案 1 :(得分:5)
tom = [a, b, c]
将值1,2和3放入列表中。一旦这些值在列表中,就无法知道指向它们的名称。假设它们是全局变量,你可以(但几乎肯定不应该)这样做:
tom = ["a", "b", "c"]
for n in tom:
globals()[n] = 1
尝试在循环中设置单个变量几乎总是错误的方法。这些值显然有一些共同之处,否则您不希望在循环中更改它们,因此将它们存储在列表中(或者字典,如果您需要它们的名称)并访问和在那里改变它们,而不是使用单个变量。
答案 2 :(得分:2)
更简洁,
a, b, c = map(lambda x: 6, [1, 2, 3])
或
a, b, c = 1, 2, 3
a, b, c = map(lambda x: 6, [a, b, c])
如果您希望根据原始值将每个值分配给不同的值,则可以很容易地进行推广。
答案 3 :(得分:2)
最好不要使用变量,而是使用字典中的键,如下所示:
values = {
'a': 1,
'b': 2,
'c': 3
}
for k in values:
values[k] = 6
print values['a']
# prints: 6
如果您只想更改某些值,请使用:
for k in ['a', 'c']:
values[k] = 6
答案 4 :(得分:0)
这是一个想法。
seniority = [range(1, 6)]
people = ["Richard", "Rob", "Steve", "Terry", "Micah"]
people = seniority
print people
输出:[[1,2,3,4,5]]