我知道这个问题已经在one表单或another中提出,但没有一个答案解决了我所看到的行为。我了解到,对象列表只应包含引用到这些对象。我观察到的似乎是这样:
class Foo(object):
def __init__(self,val):
self.value=val
a = Foo(2)
b = [a]
print b[0].value
a = Foo(3)
print b[0].value
我希望首先打印2
,然后打3
,因为我希望b[0]
指向a
,现在它是一个新对象。相反,我看到2
和2
。我在这里缺少什么?
答案 0 :(得分:3)
b[0]
指向您最初使用Foo(2)
创建的对象。执行a = Foo(3)
后,您将创建一个新对象并将其命名为a
。您没有以任何方式更改b
。
行为是因为你所说的:b
拥有对对象的引用。它不会保留对用于引用该对象的名称的引用。因此b[0]
中的对象对任何名为a
的变量一无所知。为a
分配新值对b
无效。
答案 1 :(得分:3)
在Python中,赋值运算符将右侧表达式的结果绑定到左侧表达式中的名称。
所以,当你说
时a = Foo(2)
b = [a]
您已创建Foo
个对象,并将其引用a
。然后,您创建一个列表b
,其中包含对Foo
对象(a
)的引用。这就是b[0].value
打印2
。
但是,
a = Foo(3)
创建一个新的Foo
对象,并使用名称a
引用该对象。所以,现在a
引用新的Foo
对象而不是旧对象。但该列表仍然只引用旧对象。这就是为什么它仍然打印2。