2009-05-09 10 views
3
class example: 

    def exampleMethod(self): 
     aVar = 'some string' 
     return aVar 

この例では、example.exampleMethod()を呼び出すたびにガベージコレクションがどのように機能しますか?メソッドが返されると、aVarは割り当て解除されますか?Pythonのガベージコレクションはどのようにクラスメソッドで動作しますか?

+6

このメソッドはクラスメソッドではありません。これはインスタンスメソッドです。 –

答えて

6

変数は決して割り当て解除されません。

オブジェクト(オブジェクトが割り当て解除されることはないができるように、この場合に'some string'の値を持つ文字列が、何度も再利用される。いかなる変数がオブジェクトを指していない場合

オブジェクトが割り当て解除されている。この考えこの場合

a = 'hi mom' 
a = 'next value' 

は、最初のオブジェクト(値'hi mom'持つ文字列)がもはや第ステートメントが実行されるスクリプト内の任意の場所で参照されている。オブジェクト('hi mom')をメモリから削除することができない。

+0

私はあなたの第2段落が十分明確ではないと思います。おそらく、メソッドのコードオブジェクトの定数であるため、 '一部の文字列'が割り当てられたままになっているので、メソッドが存在する間(通常はプロセスが終了するまで)参照され、メモリ内にとどまります。 – tzot

4

オブジェクトに変数を割り当てるたびに、このオブジェクトの参照カウンタが増加します。

a = MyObject() # +1, so it's at 1 
b = a # +1, so it's now 2 
a = 'something else' # -1, so it's 1 
b = 'something else' # -1, so it's 0 

NoObjectはこのMyObjectオブジェクトにアクセスできます。私たちはもはや最初の行で作成しました。

カウンタがゼロになると、ガベージコレクタはメモリを解放します。

参考カウンタを増やさないトリッキーな参照を作成する方法があります(fict.pictureがキャッシュの一部にあるためにオブジェクトをメモリに保持したくない場合)。

さらに、cPythonのリファレンスカウントはhereです。

Pythonは言語ですが、cPythonは(かなり普及している)実装です。 Afaik言語自体は指定していないどのようにメモリが解放されます。

3

example.exampleMethod()を呼び出して結果を割り当てずに(例:a = example.exampleMethod())、CPythonが参照カウントメカニズムを使用するため、すぐにCPythonで割り当て解除されます。文字列は、実装に特化した最適化がいくつかあるため、使用するにはあまり良い例ではありません。文字列はキャッシュされ、再利用できるように割り当て解除されません。これは、文字列がdictsのキーとして使用するのが非常に一般的であるため、特に便利です。

また、CPython、Jython、IronPythonは動作が異なり、そのほとんどはそれぞれのsites/manuals/code/etcに記載されています。ちょっと調べたいのであれば、()メソッドを定義したクラスを作成することをお勧めします。このメソッドは、オブジェクトがガベージコレクションされるときに呼び出されます(デストラクタです)。それを呼び出すことができるように何かをプリントするようにしてください:)

0

Nicoの回答と同様に、exampleMethodから返された結果と何をするかによって異なります。 Python(あるいはCPythonはとにかく)は参照カウントを使います。メソッド中、aVarは文字列を参照し、その後は変数aVarが削除され、参照が残っていない場合は削除されます。

以下は、デストラクタ(デル(自己))を持つカスタムクラスの例であり、 "オブジェクト1が破壊されている"または同様のものを出力します。gcは、ガベージコレクタモジュールであり、参照カウント0のオブジェクトを自動的に削除します。利便性のためにそこにあります。ガベージコレクタの実行時には保証されません。

import gc 
class Noisy(object): 
    def __init__(self, n): 
     self.n = n 
    def __del__(self): 
     print "Object " + str(self.n) + " being destructed"  
class example(object): 
    def exampleMethod(self, n): 
     aVar = Noisy(n) 
     return aVar 
a = example() 
a.exampleMethod(1) 
b = a.exampleMethod(2) 
gc.collect() 
print "Before b is deleted" 
del b 
gc.collect() 
print "After b is deleted" 

結果は次のようにすべきである:それは変数に割り当てられていないような方法は、これの参照カウントを有する、返された後に最初の雑音オブジェクトが削除されること

Object 1 being destructed 
While b lives 
Object 2 being destructed 
After b is deleted 

お知らせ0の参照カウントを残して、変数bが削除された後にのみ2番目のものが削除されます。

関連する問題