Skip to main content
 首页 » 编程设计

python之涉及循环引用时不执行 __del__method

2025年05月04日16bluestorm

我发现自定义的__del__ 方法在涉及到循环引用时似乎不会执行。

这是一个示例代码:

class DelClass(): 
        def __init__(self,a): 
            self.prop = a  
 
        def __del__(self): 
            print 'del' 
 
 
 
if __name__ == "__main__": 
 
    dc1 = DelClass(None) 
    dc2 = DelClass(dc1)#dc2 referring to dc1 
    dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference 
    del dc1#not executing the custom __del__ method 
 
    dc = DelClass(1) 
    del dc#executing the custom __del__ method 

为什么会这样?

编辑: 感谢布伦巴恩。我找到了原因。

del something 只会将 something 的引用计数减 1。

__del__ 只会在引用计数达到 0 时执行。

这是一个测试代码:

import gc 
 
class DelClass(): 
    def __init__(self,name,a): 
        self.name = name 
        self.prop = a 
 
    def __del__(self): 
        print '#####deleting',self.name 
 
dc1 = DelClass("dc1",None) 
dc2 = DelClass("dc2",dc1)#dc2 referring to dc1 
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference 
print "before deleting dc1,reference count:",len(gc.get_referrers(dc1)) 
del dc1#not executing the custom __del__ method 
print "after deleting dc1, reference count:",len(gc.get_referrers(dc2.prop)) 
print "deleting the reference held by dc2" 
del dc2.prop 
print dc2 

输出是:

before deleting dc1,reference count: 2 
after deleting dc1, reference count: 1 
deleting the reference held by dc2 
#####deleting dc1 
<__main__.DelClass instance at 0x9316dec> 
#####deleting dc2 

又出现了一个问题:

为什么会出现输出中的最后一行(#####deleting dc2)?

某些隐式 del 操作发生了吗?

请您参考如下方法:

阅读documentation for __del__和 for the garbage collector . __del__ 并不像您认为的那样,del 也不行。 __del__ 在执行 del 时不一定会被调用,并且在循环引用的情况下可能永远不会被调用。 del 所做的只是将引用计数减 1。