python 中的对象引用列表

List of object references in python

我知道 form or 中已经有人问过这个问题,但是 none 的答案解决了我所看到的行为。我了解到对象列表应该只包含对这些对象的 references。我观察到的似乎与此相符:

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,它现在是一个新对象。相反,我看到 22。我在这里错过了什么?

b[0] 指向您最初使用 Foo(2) 创建的对象。当您执行 a = Foo(3) 时,您创建了一个新对象并将其命名为 a。您没有以任何方式更改 b

该行为正是因为您所说的:b 持有对 对象 的引用。它不持有对您用来引用该对象的 name 的引用。因此 b[0] 中的对象对任何名为 a 的变量一无所知。为 a 分配新值对 b.

没有影响

在 Python 中,赋值运算符将右侧表达式的结果绑定到左侧表达式中的名称。

所以,当你说

a = Foo(2)
b = [a]

您已经创建了一个 Foo 对象并使用 a 引用它。然后创建一个列表 b 并引用 Foo 对象 (a)。这就是 b[0].value 打印 2.

的原因

但是,

a = Foo(3)

创建一个新的 Foo 对象并使用名称 a 引用它。所以,现在 a 指的是新的 Foo 对象而不是旧对象。但是列表仍然只引用旧对象。这就是为什么它仍然打印 2.