web-dev-qa-db-ja.com

Python)での手動ガベージコレクション

gc.collect()を呼び出しても、ガベージコレクションが削除を拒否するオブジェクトを手動で削除する方法はありますか? Python 3.0

17
Casebash

docs ごとに、gc.get_referrers(thatobject)whyオブジェクトがまだ生きていることを教えてくれます(直後に実行してください) gc.collect()は、望ましくない「活気」が持続することを確認します)。その後、それはどういうわけか黒い芸術です;-)。リファラーの一部がリストであることに気付くことがよくあります(そのリストがthatobjectを参照しているのはなぜですか?.remove緊急モードですが、通常のコードの音を出す方が良いです...)、そしてさらに多くの場合、dicts(その多くは__dict__sいくつかのクラスインスタンスまたは他の-どれを見つけるのは簡単ではないことがよくあります...繰り返しますが、ブルートフォース除去は時々便利な緊急ソリューションですが、持続可能な長距離ソリューションではありません!-)。

24
Alex Martelli

GCがそれを破壊することを拒否している場合、それはどこかにそれへの参照があるためです。参照を削除すると、(最終的には)実行されます。例えば:

myRef = None

GCは、必要がない限り、オブジェクトを破壊しない場合があることに注意してください必然的に.

オブジェクトがPythonの管理下にないリソースを保持している場合(たとえば、Pythonから呼び出されたCコードを使用したトリック)、オブジェクトはリソースリリース呼び出しを提供する必要があるため、必要なときに実行できますPythonが決定するときではなく。

4
paxdiablo

delまたはNoneはあなたののみ友達です

>>> a = "Hello"
>>> a = None
Or
>>> del a
4

それはあなたのPythonが実行されているものに依存します。 ここに良い記事があります 詳細を説明します

引用:

CPythonの現在のリリースでは、ループ内のxへの新しい割り当てごとに、以前に割り当てられたリソースが解放されます。 GCを使用する場合、これは保証されません。任意のPython実装で機能するコードを記述したい場合は、リソースを明示的に閉じる必要があります。これは、GCに関係なく機能します。

for name in big_list:
    x = Resource()
    do something with x
    x.close()
1
Bostone