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