Python中的手动垃圾回收

19 投票
4 回答
35477 浏览
提问于 2025-04-15 15:29

有没有办法手动删除一个对象,即使我调用了 gc.collect(),垃圾回收也不愿意处理它?我在使用Python 3.0。

4 个回答

4

如果垃圾回收(GC)不愿意销毁某个对象,那是因为你在某个地方还持有对它的引用。只要把这个引用去掉,它就会(最终)被销毁。例如:

myRef = None

要记住,垃圾回收可能不会一定销毁你的对象,除非它真的需要这样做。

如果你的对象占用了不是由Python管理的资源(比如通过Python调用的C代码的一些技巧),那么这个对象应该提供一个资源释放的调用方法,这样你就可以在想要的时候释放资源,而不是等Python来决定。

4

delNone 是你唯一的好朋友

>>> a = "Hello"
>>> a = None
Or
>>> del a
28

根据文档gc.get_referrers(thatobject)可以告诉你这个对象为什么还存在(最好在执行完gc.collect()后再使用这个方法,这样可以确保你发现的“存活”状态是持续的)。之后的事情就有点复杂了;-)。你会发现,有些引用者是列表(那么,为什么这个列表会引用thatobject呢?在紧急情况下你可以用.remove把它删掉,但让代码正常运行更重要...),还有更多的情况是dict(其中很多可能是某个类实例的__dict__,而且通常不容易找出具体是哪一个...同样,强行删除有时候是个临时解决办法,但绝对不是长久之计!)。

撰写回答