2017-06-06 18 views
0

私はこのアプローチを使ってPythonでオブジェクトを削除しようとしています。ガベージコレクタは、参照されていないオブジェクトを自動的に削除するというPythonのドキュメントを読んでいます。最後のステップ Pythonを使用してメモリ内のオブジェクトを削除する

def check(): 
    class newOb(): 
     def __init__(self,value): 
      self.value = value 
      print self.value 
      return None 

    class ob: 
     ins = {} 
     def cr(self,someuniqueid,value) : 
      newV = newOb(value) 
      ob.ins[someuniqueid] = newV ## saving this object refernce to the ob class ins dictionary 
      return newV 

    #### Accessing Object ### 
    someuniqueid = 12 
    c = ob() 
    d = c.cr(someuniqueid,123) 
    print d.value ## will print 123 
    # now deleting the associated object 
    del c.ins[someuniqueid] 

check() 

は、私は、どのようなコードが間違っているし、それを

を修正する方法

ない場合は、メモリからオブジェクトを削除します は、上記の手順使用しているメモリからのオブジェクト参照を削除しています

+0

あなたがしようとしていることは本当に明確ではありません。ディクショナリからエントリを削除したい場合、 'del'はあなたが望むものではありません。 https://stackoverflow.com/questions/6146963/when-is-del-useful-in-python – pvg

+1

ご質問はありますか? 'del'演算子が' c.ins [someuniqueid] 'によって参照される値をガベージコレクトするのに十分であるかどうか尋ねていますか?もしそうなら、はい(他の何かが参照を保持しない限り)。 – dimo414

+0

'del'は参照カウントを減らします。参照カウントがゼロの場合、オブジェクトは削除の候補になります。ガベージコレクタの正確なタイミングは複雑で、めったに即時ではありません。 'sys.getrefcount()' https://docs.python.org/3/library/sys.html#sysを参照してください。getrefcount – cdarke

答えて

1

またdも同じオブジェクトへの参照を保持しているので、del dを実行する必要があります。 delを呼び出すと、参照カウントが減り、特定の参照が使用から削除されますが、実際のメモリオブジェクトは参照カウントが0に達するまでガベージコレクションされません。

0

私はあなたが書き込みによって意味ですかわからない:ない、その後どのようなコードが間違っていると、あなたが参照を削除delステートメントを使用する場合、それ

を修正する方法

の場合オブジェクトに。ガベージコレクタが呼び出されるまでメモリを使い切ります。これは時間がかかるプロセスであり、プロセスが実行を継続するのに十分なメモリを持っている場合は不要であることに注意してください。

一般的に言って、Pythonは、デストラクタbahaviourのようなC++を実行しません。

「エキスパートPythonプログラミング」からの引用:そのようなメモリ管理のアプローチは、大きくシンプル 声明に基づいています

:指定されたオブジェクトがもはや参照されない場合、それは削除されます。 は、言い換えれば、関数内のすべてのローカル参照は インタプリタ後に削除されます。

•は•オブジェクトはもう使用されていないことを確認します機能

葉。

通常の状態では、コレクタは という素晴らしい仕事をします。しかし、delコールは、 によって手動でオブジェクトへの参照を手作業で削除することによってガベージコレクタを手助けするために使用できます。

したがって、メモリを手作業で管理する必要はありません。ガベージコレクタを助けることができますが、メモリ管理を残しておく方が良いでしょう。

関連する問題