2016-06-14 9 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個取り除くことを考えました。私は上記のスニペットを、私がやっていることを示すために書いただけです。

Edit2:誰かがこの質問に対して否定的な投票をなぜ説明することができますか?私が欠けている明らかな解決策はありますか?

編集3:私がやっていることの途中で別の機能を作成できません。だから、私は、ドキュメントから音符当たりの削除変数オプション

+5

なぜあなたはこれをやっていますか?あなたが解決しようとしている実際の問題は何ですか? – jonrsharpe

+2

解決しようとしている問題は、自動メモリ管理システムによってほぼ確実に解決されています。 – user2357112

+0

また、['locals's docs](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()を明示的に呼び出すことができますが、通常は不要です。

関連する問題