これは、参照カウントがPythonでどのように機能するかをよりよく理解するための試みです。クラス変数の参照カウントを理解する
クラスを作成してインスタンス化しましょう。 (それは独自の内部構造が1
で参照カウントを増やし、そのクラスのインスタンスを参照しますので、getrefcount
ディスプレイ2
)インスタンスの参照カウントは1
次のようになります。
>>> grc(a.x)
3
:
>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000
>>> a = A()
>>> grc(a)
2
a
の内部変数x
は2
の参照を持っています
私はそれがa
とA
の__init__
メソッドによって参照されることを期待しました。それから私はチェックすることにしました。
変数x
にアクセスできるように、名前空間に一時変数b
を作成しました。それは3
になることは(予想通り)1
によりREF-数を増加:
>>> b = a.x
>>> grc(a.x)
4
その後、私はクラスのインスタンスと1
減少参照カウントを削除:
>>> del a
>>> grc(b)
3
だから今があります2
参照:1つはb
であり、1つはA
である(予想通り)。
A
を__main__
から削除すると、私はカウントが再び1
で減少すると予想しています。
>>> del A
>>> grc(b)
3
しかし、それは起こりません。 A
クラスまたは100000
を参照する可能性のあるインスタンスはありませんが、それでも以外の__main__
名前空間によって参照されています。
私の質問は、100000
とは何ですか?b
から離れていますか?
BrenBarnは、私が代わりにどこかに内部的に保存することができる数のobject()
を使用する必要があることを示唆しました。非常に論理的であるb
によって唯一つの基準があったインスタンスa
を削除した後
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
。
数字が100000
のようになっていない理由は、理解しておく必要があることだけです。
私の推測は、 'A .__ dict__'ですか? –
@JakobBowyerしかし、私が 'A'を削除すると、' A .__ dict__'は(私が理解するように)何も参照されていないのでガベージコレクションされるべきです。 – ovgolovin
この回答を見る:http://stackoverflow.com/questions/759740/unexpected-result-from-sys-getrefcount –