a = Foo(2)
b = [a]
Foo
对象并用a
引用它。然后你创建一个包含对Foo
对象(a
)的引用的列表b
。这就是为什么b[0].value
输出2
的原因。a = Foo(3)
创建一个新的Foo
对象,并用名称a
引用它。因此,现在a
引用新的Foo
对象而不是旧对象。但列表仍然只有对旧对象的引用。这就是为什么它仍然打印2的原因。
b[0]
指向您最初使用Foo(2)
创建的对象。当您执行a = Foo(3)
时,您将创建一个新对象并将其命名为a
。您没有以任何方式更改b
。b
保存对对象的引用。它不保存对您用来引用该对象的名称的引用。因此,在b[0]
中的对象不知道任何名为a
的变量。将新值分配给a
不会影响b
。