【问题标题】:List of object references in pythonpython中的对象引用列表
【发布时间】:2015-05-08 04:48:32
【问题描述】:
我知道这个问题已经在这里以one 或another 形式提出,但没有一个答案能解决我所看到的行为。我了解到对象列表应该只包含对这些对象的 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,它现在是一个新对象。相反,我看到2 和2。我在这里错过了什么?
【问题讨论】:
标签:
python
list
reference
【解决方案1】:
在 Python 中,赋值运算符将右侧表达式的结果绑定到左侧表达式的名称。
所以,当你说
a = Foo(2)
b = [a]
您创建了一个Foo 对象并使用a 引用它。然后创建一个列表b 并引用Foo 对象(a)。这就是为什么b[0].value 打印出2。
但是,
a = Foo(3)
创建一个新的Foo 对象并使用名称a 引用它。所以,现在a 指的是新的Foo 对象而不是旧对象。但该列表仍然只引用旧对象。这就是为什么它仍然打印 2。
【解决方案2】:
b[0] 指向您最初使用Foo(2) 创建的对象。当您执行a = Foo(3) 时,您将创建一个新对象并将其命名为a。您没有以任何方式更改b。
这种行为正是因为您所说的:b 持有对 对象 的引用。它不包含对您用来引用该对象的 name 的引用。所以b[0] 中的对象不知道任何名为a 的变量。为a 分配新值对b 没有影响。