这是为了更好地理解引用计数在 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。