Python中的循环引用和析构函数

时间:2015-02-14 00:12:30

标签: python destructor

我正在阅读一篇文章,说明 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)。任何人都可以向我解释这种行为吗?

0 个答案:

没有答案