2014-04-04 38 views
1

我有我正在迭代的對象列表。如何在列表中分配變量而不僅僅是列表元素? (for python)

每次循環後,我想將該對象設置爲None並強制垃圾收集器運行。

但是我不知道如何分配對象而不是元素。例如:

a = [ object1, object2, object3] 

for i in xrange(0,len(a)]: 
     #do something with object 
     .... 
     #done working on object 
     a[i] = None <-- This sets element i to None and leaves the object intact. 

我試圖這樣做的原因是因爲我正在使用機器學習庫並遍歷許多分類器。分類器記憶了大量的預測。因此,一旦我將預測寫入CSV,我不再需要它們。這就是爲什麼在每個循環結束時,我希望刪除分類器,然後運行gc.collect()並理想地改進內存管理。

所以問題是,我如何將對象分配給None?

+2

當您分配'None'並且不存在其他參考時,這些對象將自動標記爲GC。你不必明確地觸發它。 – thefourtheye

+0

@thefourtheye是的,但分配'a [i] = None'將元素a [i]設置爲None,但object1仍然存在。這是因爲我基本上分配一個列表元素而不是對象。此外,這[問題](http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python)有一個評論,建議在每個之後運行'gc.collect()'循環將運行時間提高20%,所以我想嘗試一下 –

+2

你是對的,但是你正在通過給列表索引分配'None'來減少實際對象的引用計數。當你說'a [i] = None'時,如果'a [i]'處的對象的引用計數爲'1',那麼它將變爲0,因爲'a [i]'不再引用該對象。所以,它將爲GC做好準備。 – thefourtheye

回答

0

正如評論說@thefourtheye:

當分配None和引用不存在,該對象將被自動標記爲GC。你不必明確地觸發它。

您正在通過將None分配給列表索引來減少實際對象的引用計數。當您說a[i] = None時,您將a[i]處的對象的引用計數減少1。如果它的引用計數爲1,那麼它將使其爲0,並且由於沒有任何內容不再引用該對象,因此它將準備好用於GC。

相關問題