【发布时间】:2014-12-24 07:50:03
【问题描述】:
想问一下如何在Python中删除具有自引用的对象。
让我们考虑一个类,这是一个知道何时创建和何时删除的简单示例:
#!/usr/bin/python
class TTest:
def __init__(self):
self.sub_func= None
print 'Created',self
def __del__(self):
self.sub_func= None
print 'Deleted',self
def Print(self):
print 'Print',self
这个类有一个变量self.sub_func,我们假设给它分配一个函数。我想为self.sub_func 分配一个使用TTest 实例的函数。请看以下案例:
def SubFunc1(t):
t.Print()
def DefineObj1():
t= TTest()
t.sub_func= lambda: SubFunc1(t)
return t
t= DefineObj1()
t.sub_func()
del t
结果是:
Created <__main__.TTest instance at 0x7ffbabceee60>
Print <__main__.TTest instance at 0x7ffbabceee60>
也就是说,虽然我们执行了“del t”,但t并没有被删除。
我猜是因为 t.sub_func 是一个自引用对象,所以 t 的引用计数器不会在“del t”处变为零,因此 t 不会被垃圾收集器删除。
要解决这个问题,我需要插入
t.sub_func= None
在“del t”之前;此时,输出为:
Created <__main__.TTest instance at 0x7fab9ece2e60>
Print <__main__.TTest instance at 0x7fab9ece2e60>
Deleted <__main__.TTest instance at 0x7fab9ece2e60>
但这很奇怪。 t.sub_func 是 t 的一部分,所以我不想关心删除 t 时清除 t.sub_func。
如果你知道一个好的解决方案,你能告诉我吗?
【问题讨论】:
-
你为什么关心这个?你能用weakref吗?
-
Python 垃圾收集器可以检测循环。在多年的 python 编程中,我从未使用过弱引用,而且我很少需要显式删除。你确定你需要吗?你有记忆问题吗?
-
也许在
del之后调用gc.collect()? -
谢谢你们。我测试了 gc.collect() 但它没有用。我的 python 版本是 2.7.5+。其实到现在我都是依赖python的GC,但是我发现我的一些想要释放的对象因为这个问题没有释放。其中一些正在使用大内存。我希望这样一个对象在函数结束时释放,但它仍然存在,所以我需要重写每个代码,这很奇怪。
-
我还没有考虑过weakref。
标签: python self-reference