Python:将值赋给列表或obj中的变量

2024-05-28 18:44:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做以下工作:

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

期望的结果是a = 6

实际结果是a = 1

我猜如果没有某个执行官是不可能做到这一点的。对的?


Tags: infortom执行官
3条回答

tom = [a, b, c]将值1、2和3放入列表中。一旦这些值出现在列表中,就无法知道名称指向它们。假设它们是全局变量,您可以执行以下操作:

tom = ["a", "b", "c"]
for n in tom:
    globals()[n] = 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])

如果要根据每个值的原始值将它们分配给不同的值,则可以很容易地将其泛化。

一开始我误会了你的问题,我觉得这是对的。但我认为这个问题表明需要更详细地解释Python是如何工作的。在Python中考虑变量的最好方法是将变量名看作附加了箭头的变量,将值看作这些箭头指向的对象。变量名指向对象。所以当你这么做的时候:

a = 1

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

b = a

你的意思是“b指向与a相同的对象”。在正常情况下,一个变量不能指向另一个变量名;它只能指向另一个变量指向的同一个对象。所以当你这么做的时候:

tom = [a, b, c]

您不会创建指向变量名abc的列表;而是创建指向与abc相同对象的列表。如果更改a点的位置,则对tom[0]点没有影响。如果你改变了tom[0]点的位置,它对a点没有影响。

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

如果你真的想这样做,我的建议是要么简单地使用字典(如DzinX所建议的那样),要么,为了更接近你问题的精神并且仍然相当干净的解决方案,你可以简单地使用可变对象。然后可以使用getattrsetattr以编程方式更改该对象的属性,如下所示:

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

一般来说,最好的解决办法就是使用字典。但偶尔也会出现上述情况。

相关问题 更多 >

    热门问题