Python:在列表或对象中分配变量值

4

我想要做以下事情:

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] 吗?对原始变量的引用丢失了,对列表中每个元素设置新值不会更新原始变量。 - Felix Kling
这不会改变你的列表“tom”。如果您能提供更多关于您确切尝试做什么的细节,我可以给您一些更好的解决方案。 - Ryan Haining
5个回答

8

起初我误解了你的问题,现在看来kindall回答得很对。但我认为这个问题需要更详细地解释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所建议的),要么采用更接近你问题精神的解决方案,仍然相当干净,你可以简单地使用一个可变对象。然后你可以使用getattrsetattr来编程地改变该对象的属性,就像这样:
>>> class Foo():
...     pass
... 
>>> f = Foo()
>>> f.a = 1
>>> setattr(f, 'b', 2)
>>> getattr(f, 'a')
1
>>> f.b
2

一般情况下,最好的解决方案是使用字典。但偶尔会出现以上情况更好的情况。


5

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

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

在循环中尝试设置单个变量几乎总是错误的方法。这些值显然有共同点,否则您不会想要在循环中更改它们所有,因此,请将其存储在列表中(如果需要名称,则使用字典)并在那里访问和更改它们,而不是使用单个变量。


或者一开始就使用字典。 - Felix Kling
2
不行,不行,不要这样做,这种方法太糟糕了,你不应该教别人这个。事实上,普通的Python用户甚至不需要知道globals()被定义了。 - Jakob Bowyer
我回答了这个问题(因为它实际上是可以回答的,而且是语言的*文档功能),告诉他这是一个不好的方法,并建议更好的方法。我会编辑一些更早的额外警告,但天哪。 - kindall

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

如果你想根据它们的原始值为每个变量分配不同的值,那么这很容易推广。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接