Python中的手动垃圾收集

时间:2009-10-29 05:06:03

标签: python garbage-collection

有没有办法手动删除垃圾收集拒绝摆脱的对象,即使我打电话给gc.collect()?使用Python 3.0

4 个答案:

答案 0 :(得分:24)

根据the docsgc.get_referrers(thatobject)会告诉您为什么对象仍然存在(在gc.collect()之后立即执行以确保不受欢迎的“活跃”会坚持不懈)。在那之后,它是某种黑色艺术;-)。您经常会发现某些引荐来源是列表(所以为什么该列表指的是thatobject?您可以在紧急模式下.remove,但使正常的代码声音更好...... ),而且,更常见的是,dict(其中许多人可能是__dict__的某些类实例或其他类似实例 - 通常并不容易找出哪一个......再次,蛮力移除有时是一种权宜之计,但从来都不是可持续的远程解决方案! - )。

答案 1 :(得分:4)

如果GC拒绝销毁它,那是因为你在某个地方引用了它。摆脱参考,它将(最终)去。例如:

myRef = None

请注意,除非有必要,否则GC可能不会必然销毁您的对象。

如果你的对象持有不受Python管理的资源(例如,从Python调用C代码的一些技巧),该对象应提供资源释放调用,以便你可以在需要时而不是在Python决定时执行。

答案 2 :(得分:4)

delNone是您的唯一朋友

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

答案 3 :(得分:1)

这取决于你的Python运行方式。解释详情的Here's good article

引用:

在当前版本的CPython中,循环中x的每个新赋值都将释放先前分配的资源。使用GC,无法保证。如果要编写适用于任何Python实现的代码,则应明确关闭资源;无论GC如何,这都有效:

for name in big_list:
    x = Resource()
    do something with x
    x.close()