2016-07-21 8 views
1

私は大きな引数をとり、長い間実行される関数を書いています。それは議論が半分しか必要ない。関数への参照がなくなった場合、引数が指す値を削除する方法はありますか?早く関数の引数を削除するには?

def f(m): 
    print 'S1' 
    m = None 
    #__import__('gc').collect() # Uncommenting this doesn't help. 
    print 'S2' 
class M(object): 
    def __del__(self): 
    print '__del__' 
f(M()) 

この版画::私は必要

S1 
S2 
__del__ 

S1 
__del__ 
S2 

私がいた

は、私はこのように、それは関数が戻るとすぐに削除取得することができましたまた def f(*args):def f(**kwargs)を試してみましたが、それは役に立たなかった、私はまだ最後に210

私のコードは、Pythonに参照カウントがあり、オブジェクトの参照カウントがゼロになるとすぐに__del__が呼び出されるという事実に依存しています。私は、関数の引数の参照カウントを関数の途中でゼロにしたい。これは可能ですか?

私は回避策を知っていることに注意してください:

def f(ms): 
    print 'S1' 
    del ms[:] 
    print 'S2' 
class M(object): 
    def __del__(self): 
    print '__del__' 
f([M()]) 

この版画:

S1 
__del__ 
S2 

(APIを変更せずに早期に削除を取得する方法はあります引数のリストを渡します議論にリストを導入するなど)?

多くのPython実装で動作する移植可能なソリューションを得るのが難しい場合は、最新のCPython 2.7で動作するものが必要です。これは文書化する必要はありません。 the documentationから

+2

なぜそれをしたいですか?一般的に私は、Pythonは参照カウントが0になるとすぐに何かをガベージコレクションしないと思うが、後で定義されていないものがある。ガベージコレクションを強制することができるはずです。 – syntonym

+1

引数が呼び出し元のスコープから渡されています。最終的にオブジェクトはまだ参照されています。しかし、あなたの関数内で参照カウントを落とすことは少なくなります。親のスコープの参照がまだクリーンアップされていないため、オブジェクトがガベージコレクションされないおそれがあります。 - それは主にちょうど推測ですが、 'foo(m)'と 'foo(M)'の動作がどう違うか分かりません。論理はそれを指示します*違うべきではありませんが、実装にも依存します。 – deceze

+0

引数をバインド解除しても、関数スコープの外にはまだ存在します。 –

答えて

0

f関数のAPIを変更せずにCPython 2.7で早期削除を行うことはできないようです。

1

はCPythonの実装の詳細は:CPythonのは現在、彼らが到達不能になるとすぐに、ほとんどのオブジェクトを収集し、周期的にリンクされゴミの検出を遅らせ(別売)を参照カウント方式を採用していますが、ではありません循環参照を含むゴミを収集することが保証されています。循環ゴミの収集を制御する方法については、gcモジュールのドキュメントを参照してください。他の実装は異なって動作し、CPythonは変更される可能性があります。 オブジェクトが到達不能になったときにオブジェクトの即時終了に依存しないでください。(例:常にファイルを閉じます)。

インタープリタを自分で修正するのではなく、には、で目的を達成できません。インタプリタがそれを行うことを決定すると、__del__が呼び出されます。

+0

それともあなた自身で呼んでいますか?それでも、メモリはすぐには再生できません。 – martineau

+0

お見積もりありがとうございます。 CPythonでこれを行うための、文書化された将来の証明方法はないことが証明されています。私は質問を明確にしました。私はCPython 2.7で動作する文書化されていない解決策でさえ受け入れます。 – pts

+0

@martineau: 'm .__ del __()'を手動で呼んでも助けにならない。 '__del__'を呼び出す必要はありません。Pythonインタプリタがそのオブジェクトを削除したいという指標として' __del__'を使用しています。早く削除されるオブジェクトが気になります。 – pts

関連する問題