有没有办法手动删除垃圾收集拒绝摆脱的对象,即使我打电话给gc.collect()
?使用Python 3.0
答案 0 :(得分:24)
根据the docs,gc.get_referrers(thatobject)
会告诉您为什么对象仍然存在(在gc.collect()
之后立即执行以确保不受欢迎的“活跃”会坚持不懈)。在那之后,它是某种黑色艺术;-)。您经常会发现某些引荐来源是列表(所以为什么该列表指的是thatobject
?您可以在紧急模式下.remove
,但使正常的代码声音更好...... ),而且,更常见的是,dict
(其中许多人可能是__dict__
的某些类实例或其他类似实例 - 通常并不容易找出哪一个......再次,蛮力移除有时是一种权宜之计,但从来都不是可持续的远程解决方案! - )。
答案 1 :(得分:4)
如果GC拒绝销毁它,那是因为你在某个地方引用了它。摆脱参考,它将(最终)去。例如:
myRef = None
请注意,除非有必要,否则GC可能不会必然销毁您的对象。
如果你的对象持有不受Python管理的资源(例如,从Python调用C代码的一些技巧),该对象应提供资源释放调用,以便你可以在需要时而不是在Python决定时执行。
答案 2 :(得分:4)
del
或None
是您的唯一朋友
>>> 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()