让我们考虑以下代码:
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 的对象列表。[...]