为什么有三个对类属性的引用?



让我们考虑以下代码:

import sys
import gc
class A:
a = "something here to print"
def __init__(self):
pass
a = A()
print(sys.getrefcount(A.a))  # prints 3

refs = gc.get_referents(A.a)
print(len(refs))             # prints 0

我不明白为什么它会打印 3。第三个参考在哪里?

为什么gc.get_referents返回一个空列表?

sys 的文档回答了您问题的第一部分:

sys.getrefcount(object(:返回对象的引用计数。返回的计数通常比预期的要高,因为它包含(临时(引用作为 getrefcount(( 的参数。

考虑一下问题的第二部分:

import sys
import gc

class A:
a = "something here to print"
def __init__(self):
pass
a = A()
print(sys.getrefcount(A.a))     # prints 3
refs = gc.get_referents(A.a)
print(len(refs))                # prints 0
refs2 = gc.get_referrers(A.a)   # prints 2 (what you expected)
print(len(refs2))

请参阅两种 gc 方法的文档:

gc.get_referents(*objs(:返回任何参数直接引用的对象列表。...]

gc.get_referrers(*objs(:返回直接引用任何 objs 的对象列表。[...]

相关内容

  • 没有找到相关文章

最新更新