del myObject
时__del__
没有被调用,那么说明myObject至少还有一个未释放的引用。我猜您可能已经将其放入列表、字典或集合(或者是记忆缓存)中,并且没有复制对象,只是保存了对原始对象的第二个引用。即使执行以下操作:myObject = MyObjectClassWith__del__()
del myObject
如果类的__init__
方法或__new__
方法将新实例保存到某个类级缓存或结构中,则可能不一定调用__del__
。
总之,通过检查代码或使用其他答案中发布的weakref或gc方法来检查其他引用。
如果您想强制进行垃圾回收,可以尝试使用gc.collect。如果您想找出仍然引用您的对象并可能阻止其被垃圾回收的对象,请使用gc.get_referrers
和gc.get_referents
进行测试。
gc
模块不会回收具有 __del__
方法的对象,因此调用 gc.collect()
不会回收它。它可能只是将对象放入 gc.garbage
中。 - Thomas Wouters
__del__
,而应该使用上下文管理器。 - Cat Plus Plus