2012-01-24 39 views
4

我要做到以下几点:的Python:在一个列表赋值给变量或对象

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

期望的结果是a = 6

实际的结果是a = 1

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

+1

应该'tom'是'[6,6,6]'然后?你知道'tom = [a,b,c]'的结果是'[1,2,3]'吗?对原始变量的引用丢失,为列表中的每个元素设置一个新值不会更新原始变量。 –

+0

也不会改变你的列表“汤姆”。有关您正在尝试完成的更多详细信息,我可以给您一些更好的解决方案 –

回答

6

起初我误解了你的问题,而且我看到这种说法是正确的。但我认为这个问题表明需要更详细地解释Python如何工作。考虑在Python变量的最佳方式是考虑的变量名作为具有箭头附连到它们,和值作为对象到这些箭头点。变量名称指向对象。所以,当你这样做:

a = 1 

你真的说:“a1”。当你这样做:

b = a 

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

tom = [a, b, c] 

没有创建一个指向变量名ab,并c清单;您正在创建一个指向与abc相同的对象的列表。如果你改变a点,它对tom[0]点没有影响。如果你改变tom[0]分,那么它对a点的位置没有影响。

现在,正如其他人所指出的那样,你可以编程使用exec如你所说(不推荐),或通过改变globals()改变变量名,醚的值(也不推荐)。但大多数时候,这是不值得的。

如果你真的想这样做,我的建议可能不是简单地使用字典(如DzinX建议的那样),或者对于接近问题精神并且仍然合理清洁的解决方案,您可以简单地使用可变对象。然后你可以使用getattrsetattr以编程方式改变该对象的属性,像这样:

>>> class Foo(): 
...  pass 
... 
>>> f = Foo() 
>>> f.a = 1 
>>> setattr(f, 'b', 2) 
>>> getattr(f, 'a') 
1 
>>> f.b 
2 

一般情况下,最好的解决办法是只使用一本字典。但偶尔会出现上述情况更好的情况。

4

tom = [a, b, c]将值1,2和3放入列表中。一旦这些值在列表中,就无法知道指向它们的名称。假设他们是全局变量,你可以(但几乎可以肯定不应该)做:

tom = ["a", "b", "c"] 
for n in tom: 
    globals()[n] = 1 

试图在循环中设置单个变量几乎总是错误的做法。该值显然有共同的东西,否则你不会想改变它们都在一个循环,所以它们存储在一个表(或字典,如果你需要为他们的名字)和访问并改变他们那里,而不是使用个体变量。

+0

或者首先使用字典。 –

+0

好点,我补充说。 – kindall

+2

否否否否否。这是一种可怕而恶心的方式,你不应该在教这个。事实上,普通的python用户甚至不需要知道'globals()'是被定义的。 –

1

更简洁,

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]) 

如果要基于其原始值分配给每个不同的值可能很容易推广。

+0

这似乎是无偿的。 – Marcin

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 
0

这是一个想法。

seniority = [range(1, 6)] 
people = ["Richard", "Rob", "Steve", "Terry", "Micah"] 
people = seniority 
print people 

输出:[[1,2,3,4,5,]]