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

Cyclic references and garbage collection in python

我只是想确保我理解 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

我需要在设置新的 child 之前创建 self._child.parent = None 以便旧的 child 可以被丢弃吗?上面的链接参考让我不知所措,我不确定这种情况。到目前为止我发现的所有内容都描述了删除两个元素并且它们有一个指向彼此的指针的情况。

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

当对子对象的引用消失时,圆圈被打破,可以通过正常的引用计数机制删除该对象;它本身仍然有 outgoing 引用并不重要。

即使存在循环引用,垃圾收集器也会通过破坏循环中的引用之一来处理循环。唯一需要关注的情况是圆圈中的某个对象是否具有自定义 __del__ 方法。