Python中的手动垃圾回收
有没有办法手动删除一个对象,即使我调用了 gc.collect()
,垃圾回收也不愿意处理它?我在使用Python 3.0。
4 个回答
4
如果垃圾回收(GC)不愿意销毁某个对象,那是因为你在某个地方还持有对它的引用。只要把这个引用去掉,它就会(最终)被销毁。例如:
myRef = None
要记住,垃圾回收可能不会一定销毁你的对象,除非它真的需要这样做。
如果你的对象占用了不是由Python管理的资源(比如通过Python调用的C代码的一些技巧),那么这个对象应该提供一个资源释放的调用方法,这样你就可以在想要的时候释放资源,而不是等Python来决定。
4
del
或 None
是你唯一的好朋友
>>> a = "Hello"
>>> a = None
Or
>>> del a
28
根据文档,gc.get_referrers(thatobject)
可以告诉你这个对象为什么还存在(最好在执行完gc.collect()
后再使用这个方法,这样可以确保你发现的“存活”状态是持续的)。之后的事情就有点复杂了;-)。你会发现,有些引用者是列表(那么,为什么这个列表会引用thatobject
呢?在紧急情况下你可以用.remove
把它删掉,但让代码正常运行更重要...),还有更多的情况是dict
(其中很多可能是某个类实例的__dict__
,而且通常不容易找出具体是哪一个...同样,强行删除有时候是个临时解决办法,但绝对不是长久之计!)。