我希望向你询问如何在Python中删除具有自引用的对象。让我们考虑一个类,这是一个简单的例子,了解它何时被创建和何时被删除:
结果是:
也就是说,虽然我们执行了"del t",但是t并没有被删除。我猜测原因是t.sub_func是一个自引用对象,因此在"del t"时,t的引用计数器没有变为零,因此垃圾回收器没有删除t。
为了解决这个问题,我需要插入:
在执行 "del t" 命令之前,输出结果为:
但这很奇怪。 t.sub_func是t的一部分,因此我不想在删除t时清除t.sub_func。
你能告诉我是否知道一个好的解决方案吗?
#!/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,我们假设要给它分配一个函数。我想使用TTest的实例来给self.sub_func分配一个函数。请看下面的示例:
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是一个自引用对象,因此在"del t"时,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。
你能告诉我是否知道一个好的解决方案吗?
del
后调用gc.collect()
? - Reut Sharabani