Python:为列表或对象中的变量赋值

时间:2012-01-24 15:53:02

标签: python

我想做以下事情:

a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
    i = 6

所需的结果是a = 6

实际结果为a = 1

我猜测没有某种执行官就没有办法做到这一点。正确的吗?

5 个答案:

答案 0 :(得分:7)

最初我误解了你的问题,我看到那种善意做对了。但我认为这个问题需要更详细地解释Python的工作原理。在Python中考虑变量的最佳方法是将变量名称视为附加了箭头,将值视为这些箭头指向的对象。变量名称指向对象。所以当你这样做时:

a = 1

你真的说“a指向1”。当你这样做时:

b = a

你真的说“b指向与a相同的对象”。一般情况下,变量不能指向另一个变量名;它只能指向另一个变量指向的同一个对象。所以当你这样做时:

tom = [a, b, c]

您没有创建指向变量名称 abc的列表;您创建的列表指向与abc相同的对象。如果您更改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]]