程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

涉及循环引用时__del__方法未执行

发布于2020-05-31 02:48     阅读(1585)     评论(0)     点赞(13)     收藏(0)


我发现__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

为什么会这样?

编辑: 感谢BrenBarn。我找到了原因。

del something仅将参考计数减something1。

__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发生一些隐式操作?


解决方案


阅读垃圾收集器文档__del__以及垃圾收集器文档__del__不会做您可能认为做的事情,也不会做del__del__在执行时不一定会调用del,并且在循环引用的情况下可能永远不会调用。所有del操作都是将参考计数减1。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/398409/4eb4056cfabeb6100e3d/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)