私は大きな引数をとり、長い間実行される関数を書いています。それは議論が半分しか必要ない。関数への参照がなくなった場合、引数が指す値を削除する方法はありますか?早く関数の引数を削除するには?
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から
なぜそれをしたいですか?一般的に私は、Pythonは参照カウントが0になるとすぐに何かをガベージコレクションしないと思うが、後で定義されていないものがある。ガベージコレクションを強制することができるはずです。 – syntonym
引数が呼び出し元のスコープから渡されています。最終的にオブジェクトはまだ参照されています。しかし、あなたの関数内で参照カウントを落とすことは少なくなります。親のスコープの参照がまだクリーンアップされていないため、オブジェクトがガベージコレクションされないおそれがあります。 - それは主にちょうど推測ですが、 'foo(m)'と 'foo(M)'の動作がどう違うか分かりません。論理はそれを指示します*違うべきではありませんが、実装にも依存します。 – deceze
引数をバインド解除しても、関数スコープの外にはまだ存在します。 –