2010-01-19 70 views
1

比方說,我有一個模塊mod_x類似如下:模塊級的垃圾回收在Python

class X: 
    pass 

x=X() 

現在,讓我們說我有,只是執行import mod_x,並處理其業務的另一個模塊。在解釋器的生命週期中,模塊變量x不會被進一步引用。

在解釋器終止時,類實例x是否會在任何點垃圾收集,除了

回答

3

不,這個變量永遠不會被垃圾收集(直到過程結束),因爲模塊對象將保留在sys.modules['mod_x']中,並且它將引用mod_x.x--引用計數永遠不會降爲0(直到所有模塊在程序結束時被刪除)並且它不是「循環垃圾」的問題 - 它是一個完全有效的實時參考,並且證明沒有人會(例如)getattr(sys.modules[a], b)其中字符串變量ab碰巧發生分別值得'mod_x''x'至少與解決暫停問題一樣困難;-)。 (「至少」,因爲隨時可能會動態加載更多的代碼...! - )。

+0

謝謝,這就是我的想法。這意味着我在之後的錯誤在別的地方...... – jldupont 2010-01-19 18:35:20

3

只有在其他情況下才執行del mod_x.x或重新綁定,或者模塊本身已被完全刪除。

1

一旦模塊被導入,它將在sys.modules字典中,除非它從那裏被刪除(這可能通過非標準的做法),它不會被垃圾收集。

所以,如果你有一個想要一個已被加載的模塊被垃圾收集的理由,你必須弄亂sys.modules