2016-08-31 2 views
3

は、だから私は好奇心追加ラインいつPythonでdelを使うのですか?

del parts 
del to 
del a 
del whole 
コンストラクタの内部

またはこれらの変数のためのメモリは、スコープによって管理されるのいずれかのbenifitはあり

class myClass: 
    def __init__(self): 
     parts = 1 
     to = 2 
     a = 3 
     whole = 4 
     self.contents = [parts,to,a,whole] 

を次のように私はクラスを持って言うことができます?

+4

いいえ。インタプリタは、変数が範囲外になると、つまりコンストラクタが戻るとすぐに変数を自動的に解放します。 'del'は非常にまれにしか役に立ちません。 –

+0

決して、ガベージコレクションがあります – PYPL

+0

関連:http://stackoverflow.com/questions/34430314/python-lifetime-memory-scope-of-local-variables-inside-a-function –

答えて

8

あなたは非常にメモリが不足していて、何か非常にかさばっていない限り、絶対にしないでください。あなたが通常のプログラムを書いているならば、ガベージコレクタはすべてを処理する必要があります。

大量の記事を書く場合は、delはオブジェクトを削除せず、単に逆参照することがわかります。私。変数はもはやオブジェクトデータが格納されているメモリ内の場所を参照しません。その後、メモリが解放されるように(自動的に行われるように)ガベージコレクタでクリーンアップする必要があります。

ガベージコレクタにオブジェクトのクリーニングを強制する方法もあります。は、delを実行した後に役立ちます。

import gc 
a = [i for i in range(1, 10 ** 9)] 
... 
del a 
# Object [0, 1, 2, ..., 10 ** 9 - 1] is not reachable but still in memory 
gc.collect() 
# Object deleted from memory 

更新:例えば、コメントで本当に良いのノート。メモリ内のオブジェクトへの他の参照を監視します。例えば:このブロックの実行後

import gc 
a = [i for i in range(1, 10 ** 9)] 
b = a 
... 
del a 
gc.collect() 

、大きなアレイは依然としてb介して到達可能である、洗浄されません。

+0

+1これは、ローカル変数に 'del'を使う間違った理由についての大きな説明です。 'del'が使用されると仮定される要約(例えば、リストからのものの削除、辞書の削除、属性の削除など)の質問にも答えることで、さらに改善されるでしょう。 – user4815162342

+4

'del'は値への参照を削除するという事実の重要な付加物です:もしあなたが削除しようとしているもの以外の他の参照を持っているなら、それは生きています。したがって、他の参考文献がないことが確かでない限り、メモリを解放することを 'del'と考えることはできません。 – kindall

-1

特定のキーを辞書から削除することが1つです。

>>>> food = {"apple": True, "banana": False} 
>>>> del food['banana'] 
>>>> import json 
>>>> json.dumps(food) 
'{"apple": true}' 

辞書をクリーンアップしてからJSONに変換する前に、これを常時使用しています。

+2

ええ、それは本当に私の質問のポイントではない、少なくともタイトルthoを読んでいただきありがとうございます... – kpie

関連する問題