Python参考

zch*_*odd 1 python list

我遇到过一种情况,我认为这种情况在理解引用如何在Python中工作方面存在差距.

假设我们有两个类:

class A:
    def __init__(self):
        self.x = [1,2,3]

    def modify(self):
        self.x.append(4)

    def reset(self):
        self.x = []

class B:
    def __init__(self, x):
        self._x = x

    def say(self):
        print self._x




a = A()
b = B(a.x)

b.say()
a.modify()
b.say()
a.reset()
b.say()
Run Code Online (Sandbox Code Playgroud)

我预期的输出是:

[1, 2, 3]
[1, 2, 3, 4]
[]
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

似乎当我打电话reset()并设置self.x为新列表时,所持有的引用B变得独立并继续存在,从而成为副本而不是引用.这是正确的理解吗?

Sve*_*ach 10

reset()方法

def reset(self):
    self.x = []
Run Code Online (Sandbox Code Playgroud)

不会修改存储的对象self.x- 而是创建一个新的空列表,然后存储在其中self.x.旧列表不会被更改(因为它仍然被引用b._x,它也不会被垃圾回收).要获得您所追求的行为,请使用

def reset(self):
    del self.x[:]
Run Code Online (Sandbox Code Playgroud)

清空现有列表而不是创建新列表.