2024-05-28 18:44:57 发布
网友
我想做以下工作:
a = 1 b = 2 c = 3 tom = [a,b,c] for i in tom: i = 6
期望的结果是a = 6
a = 6
实际结果是a = 1
a = 1
我猜如果没有某个执行官是不可能做到这一点的。对的?
tom = [a, b, c]将值1、2和3放入列表中。一旦这些值出现在列表中,就无法知道名称指向它们。假设它们是全局变量,您可以执行以下操作:
tom = [a, b, c]
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相同的对象”。在正常情况下,一个变量不能指向另一个变量名;它只能指向另一个变量指向的同一个对象。所以当你这么做的时候:
b
您不会创建指向变量名a、b和c的列表;而是创建指向与a、b和c相同对象的列表。如果更改a点的位置,则对tom[0]点没有影响。如果你改变了tom[0]点的位置,它对a点没有影响。
c
tom[0]
现在,正如其他人所指出的,您可以通过编程方式改变变量名的值,如您所建议的(不推荐)使用exec或通过改变globals()(也不推荐)使用ether。但大多数时候,这是不值得的。
exec
globals()
如果你真的想这样做,我的建议是要么简单地使用字典(如DzinX所建议的那样),要么,为了更接近你问题的精神并且仍然相当干净的解决方案,你可以简单地使用可变对象。然后可以使用getattr和setattr以编程方式更改该对象的属性,如下所示:
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放入列表中。一旦这些值出现在列表中,就无法知道名称指向它们。假设它们是全局变量,您可以执行以下操作:试图在循环中设置单个变量几乎总是错误的方法。这些值显然有一些共同点,否则您不想在循环中全部更改它们,因此将它们存储在列表(或者字典,如果需要名称的话)中并在那里访问和更改它们,而不是使用单个变量。
更简洁地说
或者
如果要根据每个值的原始值将它们分配给不同的值,则可以很容易地将其泛化。
一开始我误会了你的问题,我觉得这是对的。但我认为这个问题表明需要更详细地解释Python是如何工作的。在Python中考虑变量的最好方法是将变量名看作附加了箭头的变量,将值看作这些箭头指向的对象。变量名指向对象。所以当你这么做的时候:
你说的是“
a
指向1
”。当你这样做的时候:你的意思是“
b
指向与a
相同的对象”。在正常情况下,一个变量不能指向另一个变量名;它只能指向另一个变量指向的同一个对象。所以当你这么做的时候:您不会创建指向变量名
a
、b
和c
的列表;而是创建指向与a
、b
和c
相同对象的列表。如果更改a
点的位置,则对tom[0]
点没有影响。如果你改变了tom[0]
点的位置,它对a
点没有影响。现在,正如其他人所指出的,您可以通过编程方式改变变量名的值,如您所建议的(不推荐)使用
exec
或通过改变globals()
(也不推荐)使用ether。但大多数时候,这是不值得的。如果你真的想这样做,我的建议是要么简单地使用字典(如DzinX所建议的那样),要么,为了更接近你问题的精神并且仍然相当干净的解决方案,你可以简单地使用可变对象。然后可以使用
getattr
和setattr
以编程方式更改该对象的属性,如下所示:一般来说,最好的解决办法就是使用字典。但偶尔也会出现上述情况。
相关问题 更多 >
编程相关推荐