【发布时间】:2014-07-09 06:30:07
【问题描述】:
在网上冲浪 (here) 我发现使用垃圾收集器的__del__ 方法收集对象存在一些问题。
我的疑问很简单:为什么?
根据文档:
具有
__del__()方法并且属于引用循环的对象会导致整个引用循环无法收集,包括不一定在循环中但只能从循环中访问的对象。 Python 不会自动收集此类循环,因为一般情况下,Python 无法猜测运行__del__()方法的安全顺序。
为什么__del__ 方法这么有问题?实现它的对象和不实现它的对象有什么区别?它只会破坏一个实例。
【问题讨论】:
-
这个案例在Martijn's answer to your previous question中有专门的介绍;垃圾收集器确实“检测到它并回收内存”。是什么让你认为它没有?
-
是的,我知道,但根据我发布的链接:'由于没有很好的解决方案来解决这个问题,所以从具有终结器的对象引用的循环不会被释放。而是将这些对象添加到无法收集的垃圾的全局列表中。'
-
但是列表没有终结者...阅读this。
-
@jonrsharpe 您链接的上一个答案没有回答这个问题。该答案解释了 Python 的引用计数及其循环中断器,但不包括
__del__被明确排除在循环中断之外的对象,这就是这个问题的意义所在。 -
@user4815162342 您应该查看编辑 - 问题已更改