Python中的对象引用列表

9

我知道这个问题已经在某个形式或者另一个地方被问过,但是没有一个答案解决了我遇到的问题。我理解列表应该只存储对象的引用。但是我观察到的情况与之相反:

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,而现在a是一个新对象。但实际上我看到的是22。我错过了什么?

2个回答

6
在Python中,赋值运算符将右侧表达式的结果绑定到左侧表达式中的名称。因此,当您说
a = Foo(2)
b = [a]

你创建了一个Foo对象并用a引用它。然后你创建一个包含对Foo对象(a)的引用的列表b。这就是为什么b[0].value输出2的原因。
但是,
a = Foo(3)

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


4
b[0]指向您最初使用Foo(2)创建的对象。当您执行a = Foo(3)时,您将创建一个新对象并将其命名为a。您没有以任何方式更改b
这种行为正是由于您所说的原因:b保存对对象的引用。它不保存对您用来引用该对象的名称的引用。因此,在b[0]中的对象不知道任何名为a的变量。将新值分配给a不会影响b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接