python中的对象引用列表

时间:2015-05-08 04:48:33

标签: python list reference

我知道这个问题已经在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,现在它是一个新对象。相反,我看到22。我在这里缺少什么?

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。