比方說,我有一個模塊mod_x
類似如下:模塊級的垃圾回收在Python
class X:
pass
x=X()
現在,讓我們說我有,只是執行import mod_x
,並處理其業務的另一個模塊。在解釋器的生命週期中,模塊變量x
不會被進一步引用。
在解釋器終止時,類實例x
是否會在任何點垃圾收集,除了?
比方說,我有一個模塊mod_x
類似如下:模塊級的垃圾回收在Python
class X:
pass
x=X()
現在,讓我們說我有,只是執行import mod_x
,並處理其業務的另一個模塊。在解釋器的生命週期中,模塊變量x
不會被進一步引用。
在解釋器終止時,類實例x
是否會在任何點垃圾收集,除了?
不,這個變量永遠不會被垃圾收集(直到過程結束),因爲模塊對象將保留在sys.modules['mod_x']
中,並且它將引用mod_x.x
--引用計數永遠不會降爲0(直到所有模塊在程序結束時被刪除)並且它不是「循環垃圾」的問題 - 它是一個完全有效的實時參考,並且證明沒有人會(例如)getattr(sys.modules[a], b)
其中字符串變量a
和b
碰巧發生分別值得'mod_x'
和'x'
至少與解決暫停問題一樣困難;-)。 (「至少」,因爲隨時可能會動態加載更多的代碼...! - )。
只有在其他情況下才執行del mod_x.x
或重新綁定,或者模塊本身已被完全刪除。
一旦模塊被導入,它將在sys.modules
字典中,除非它從那裏被刪除(這可能通過非標準的做法),它不會被垃圾收集。
所以,如果你有一個想要一個已被加載的模塊被垃圾收集的理由,你必須弄亂sys.modules
。
謝謝,這就是我的想法。這意味着我在之後的錯誤在別的地方...... – jldupont 2010-01-19 18:35:20