これは、Python で参照カウントがどのように機能するかをよりよく理解するための試みです。
クラスを作成してインスタンス化しましょう。インスタンスの参照カウントは次のようになります( は1、そのクラス インスタンスを参照する独自の内部構造であるため、参照カウントが だけ増加します):getrefcount21
>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000
>>> a = A()
>>> grc(a)
2
aの内部変数xには2参照があります:
>>> grc(a.x)
3
とのメソッドaによって参照されることを期待していました。それから私はチェックすることにしました。A__init__
そのため、変数にアクセスできるようにするためだけにb、名前空間に一時変数を作成しました。それは(予想どおり)になるために参照番号を増やしました:__main__x13
>>> b = a.x
>>> grc(a.x)
4
次に、クラス インスタンスを削除すると、ref カウントが次のように減少しました1。
>>> del a
>>> grc(b)
3
だから今、2参照があります:1つはbybで、もう1つはbyですA(私が予想したように)。
A名前空間から削除する__main__ことで、カウントが1再び減少することを期待しています。
>>> del A
>>> grc(b)
3
しかし、それは起こりません。を参照できるクラスAまたはそのインスタンスはありませんが、名前空間100000以外の何かによって参照されています。b__main__
だから、私の質問は、何100000から離れて参照されているのbですか?
BrenBarnobject()は、内部のどこかに格納されている可能性のある数値の代わりに使用することを提案しました。
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
インスタンスを削除した後、非常に論理的なa参照が 1 つだけありました。b
理解するために残されている唯一のことは、 number ではそうではない理由100000です。