python中的循环引用和垃圾收集

时间:2015-10-06 13:36:41

标签: python garbage-collection

我只是想确保我理解https://docs.python.org/2/extending/extending.html#reference-counts

我有两个类(出于某些目的必须互相引用):

class Foo(object):
    def __init__(self, child):
        self._child = child
        self._child.parent = self
    @property
    def child(self)
        return self._child
    @child.setter
    def child(self, value):
        #Optional to delete reference to parent
        '''
        self._child.parent = None
        '''
        self._child = value
        self._child.parent = self

class Child(object):
    @property
    def parent(self):
        return self._parent
    @parent.setter
    def parent(self, value)
        self._parent = value

在设置一个新孩子之前,我是否需要制作self._child.parent = None以便旧孩子可以接受?我对以上链接的引用感到非常不知所措,这个案例是我不确定的。直到现在我发现的所有内容都描述了删除两个元素并且它们彼此指向的情况。

1 个答案:

答案 0 :(得分:1)

在这种情况下你不必设置self._child.parent = None,不。您已经通过将子对象的父引用设置为其他内容来打破圆圈。

当参考子对象消失时,圆圈被破坏,对象可以被正常的引用计数机制删除;它本身仍有传出引用并不重要。

即使有循环引用,垃圾收集器也会通过破坏圆圈中的一个引用来处理圆圈。唯一需要考虑的问题是圆圈中的一个对象是否具有自定义__del__方法。