2016-06-14 27 views
-2

我在函數的中間寫了下面的代碼來刪除除少數之外的所有變量。Python通過循環刪除局部變量

dontDelete = ['Cat','Dog'] 
for vi in dir(): #'Cat','Dog','Pig','Elephant','Lion' 
    if vi in dontDelete: 
     continue 
    else: 
     del locals()[vi] 

但它不會刪除任何變量,即使它進入del locals()[vi]聲明

EDIT1:我在函數中運行內存。所以,我想在功能中刪除我在本地擁有的100個變量。我寫了上面的代碼片段來展示我正在尋找的東西。

編輯2:有人可以解釋爲什麼在這個問題上反對票。有沒有明顯的解決方案,我錯過了。

編輯3:我無法在我正在做的事情中創建另一個函數。所以,我想從文檔嘗試刪除變量選項

+5

你爲什麼要這樣做?你試圖解決的實際問題是什麼? – jonrsharpe

+2

您嘗試解決的問題幾乎可以通過自動內存管理系統解決。 – user2357112

+0

此外,你真的應該檢查['locals'文檔](https://docs.python.org/2/library/functions.html#locals)。 – user2357112

回答

1

locals() is a view on the locals, mutating it is not recommended and provides no guarantees as to whether the "real" values are changed or not.,每注:

注:這本字典的內容不應進行修改;更改可能不會影響解釋器使用的本地變量和自由變量的值。

正確的解決方案通常是重構你的函數,所以你想刪除的所有東西都是在一個單獨函數中的局部變量,並且你想保留的東西是由該函數返回的。當子函數返回時,Python會爲你清理局部變量,所以只保留返回值;如果在本地範圍內有參考週期需要立即釋放必須,則可以在函數返回後強制呼叫gc.collect()以強制執行完整週期收集,但這通常不是必需的。