我要做到以下几点:的Python:在一个列表赋值给变量或对象
a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
i = 6
期望的结果是a = 6
实际的结果是a = 1
我猜没有某种执行力就没有办法做到这一点。正确?
我要做到以下几点:的Python:在一个列表赋值给变量或对象
a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
i = 6
期望的结果是a = 6
实际的结果是a = 1
我猜没有某种执行力就没有办法做到这一点。正确?
起初我误解了你的问题,而且我看到这种说法是正确的。但我认为这个问题表明需要更详细地解释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
如你所说(不推荐),或通过改变globals()
改变变量名,醚的值(也不推荐)。但大多数时候,这是不值得的。
如果你真的想这样做,我的建议可能不是简单地使用字典(如DzinX建议的那样),或者对于接近问题精神并且仍然合理清洁的解决方案,您可以简单地使用可变对象。然后你可以使用getattr
和setattr
以编程方式改变该对象的属性,像这样:
>>> class Foo():
... pass
...
>>> f = Foo()
>>> f.a = 1
>>> setattr(f, 'b', 2)
>>> getattr(f, 'a')
1
>>> f.b
2
一般情况下,最好的解决办法是只使用一本字典。但偶尔会出现上述情况更好的情况。
tom = [a, b, c]
将值1,2和3放入列表中。一旦这些值在列表中,就无法知道指向它们的名称。假设他们是全局变量,你可以(但几乎可以肯定不应该)做:
tom = ["a", "b", "c"]
for n in tom:
globals()[n] = 1
试图在循环中设置单个变量几乎总是错误的做法。该值显然有共同的东西,否则你不会想改变它们都在一个循环,所以它们存储在一个表(或字典,如果你需要为他们的名字)和访问并改变他们那里,而不是使用个体变量。
或者首先使用字典。 –
好点,我补充说。 – kindall
否否否否否。这是一种可怕而恶心的方式,你不应该在教这个。事实上,普通的python用户甚至不需要知道'globals()'是被定义的。 –
更简洁,
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])
如果要基于其原始值分配给每个不同的值可能很容易推广。
这似乎是无偿的。 – Marcin
这将是最好的,如果你没有使用变量,但在字典键,这样的:
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
这是一个想法。
seniority = [range(1, 6)]
people = ["Richard", "Rob", "Steve", "Terry", "Micah"]
people = seniority
print people
输出:[[1,2,3,4,5,]]
应该'tom'是'[6,6,6]'然后?你知道'tom = [a,b,c]'的结果是'[1,2,3]'吗?对原始变量的引用丢失,为列表中的每个元素设置一个新值不会更新原始变量。 –
也不会改变你的列表“汤姆”。有关您正在尝试完成的更多详细信息,我可以给您一些更好的解决方案 –