【问题标题】:List of object references in pythonpython中的对象引用列表
【发布时间】:2015-05-08 04:48:32
【问题描述】:

我知道这个问题已经在这里以oneanother 形式提出,但没有一个答案能解决我所看到的行为。我了解到对象列表应该只包含对这些对象的 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。我在这里错过了什么?

【问题讨论】:

    标签: 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 没有影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多