刪除我想詢問如何刪除與Python中的自我參照的對象。的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這是我們承擔分配的功能。我想使用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>
就是雖然我們執行 「德爾T」 的說法,,T並未被刪除。
我猜測原因是t.sub_func是一個自引用對象,所以t的引用計數器在「del t」不會變爲零,因此t不會被垃圾收集器刪除。
爲了解決這個問題,我需要之前 「德爾T」 插入
t.sub_func= None
;在這個時候,輸出是:
Created <__main__.TTest instance at 0x7fab9ece2e60>
Print <__main__.TTest instance at 0x7fab9ece2e60>
Deleted <__main__.TTest instance at 0x7fab9ece2e60>
但這很奇怪。 t.sub_func爲t的一部分,所以我不想去計較刪除牛逼結算時t.sub_func。
你能告訴我,如果你知道一個好的解決方案嗎?
爲什麼你關心這個?你可以使用[weakref](https://docs.python.org/2/library/weakref.html)嗎? – BrenBarn
Python垃圾收集器可以檢測週期。在多年的python編程中,我從來沒有使用弱引用,而且我很少**需要明確的刪除。你確定你需要嗎?你有沒有記憶問題? – slezica
也許在'del'後面調用'gc.collect()'? –