これは、Python で参照カウントがどのように機能するかをよりよく理解するための試みです。
クラスを作成してインスタンス化しましょう。インスタンスの参照カウントは次のようになります( は1
、そのクラス インスタンスを参照する独自の内部構造であるため、参照カウントが だけ増加します):getrefcount
2
1
>>> 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__
x
1
3
>>> 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
です。