Python 3.x 为什么对class属性有三个引用? 让我们考虑这个代码: 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

Python 3.x 为什么对class属性有三个引用? 让我们考虑这个代码: 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,python-3.x,class-attributes,Python 3.x,Class Attributes,我不明白为什么它会打印3。第三个参考点在哪里 为什么gc.get\u referents返回一个空列表?文档回答了问题的第一部分: sys.getrefcount(对象): 返回对象的引用计数。返回的计数通常比您预期的要高,因为它包含(临时)引用作为getrefcount()的参数 考虑一下问题的第二部分: 导入系统 导入gc A类: a=“要打印的内容” 定义初始化(自): 通过 a=a() 打印(sys.getrefcount(A.A))#打印3 refs=gc.get\u引用(A.A) 打

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

为什么
gc.get\u referents
返回一个空列表?

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

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

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

导入系统 导入gc A类: a=“要打印的内容” 定义初始化(自): 通过 a=a() 打印(sys.getrefcount(A.A))#打印3 refs=gc.get\u引用(A.A) 打印(透镜(参考文献))#打印0 refs2=gc.get_referers(A.A)#prints 2(您所期望的) 打印(透镜(参考文献2)) 请参阅两种方法的文档:

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

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