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