这是为了更好地理解引用计数在 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
's__init__
方法引用。然后我决定检查一下。
所以我b
在__main__
命名空间中创建了一个临时变量,只是为了能够访问该变量x
。它增加了 ref-number 以1
使其成为3
(如预期的那样):
>>> b = a.x
>>> grc(a.x)
4
然后我删除了类实例,引用计数减少了1
:
>>> del a
>>> grc(b)
3
所以现在有2
参考资料:一个是by b
,一个是by A
(如我所料)。
A
通过从命名空间中删除,__main__
我希望计数再次减少1
。
>>> del A
>>> grc(b)
3
但它不会发生。没有A
可以引用的类或其实例100000
,但它仍然被命名空间以外的东西b
引用__main__
。
所以,我的问题是,100000
除了引用什么b
?
BrenBarn建议我应该使用object()
而不是可能存储在内部某处的数字。
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
删除实例后a
,只有一个b
非常合乎逻辑的引用。
唯一需要理解的是为什么它不是这样的 number 100000
。