我正在阅读一篇文章,说明 del 方法和循环引用的存在会阻止对象被垃圾回收。这是一个简单的测试代码
class FooType():
def __init__(self, id, parent):
self.id = id
self.parent = parent
print('Foo', self.id, 'born')
def __del__(self):
print('Foo', self.id, 'died')
class BarType():
def __init__(self, id):
self.id = id
self.foo = FooType(id, self)
print('Bar', self.id, 'born')
def __del__(self):
print('Bar', self.id, 'died')
b = BarType(12)
正如我可以想象的那样,Bartype在初始化期间调用FooType,这反过来又保留了Bartype的引用。一个简单的循环引用。我希望解释器在没有垃圾收集的情况下退出。但是,此代码的输出显示该对象在退出之前已被破坏。
Foo 12 born
Bar 12 born
Foo 12 died
Bar 12 died
我能想到的唯一原因是CPython可能有一些更新(我的版本是3.4)。任何人都可以向我解释这种行为吗?