我试图理解refcounts如何在python中工作,有人可以解释为什么当它只有1个对象实例时,计数被打印为2? (是因为临时传递给getrefcount方法?)另外,为什么从成员调用时调用的数字更多(是自引用是否会引起引用?)
import sys
class A:
def print_ref_count(self):
print sys.getrefcount(self)
a = A()
print sys.getrefcount(a) # prints 2
a.print_ref_count() # prints 4
print sys.getrefcount(a) # prints 2
答案 0 :(得分:2)
Python中到处都有隐式引用增量。当您将a
作为参数传递给函数时,它会逐渐增加,如getrefcount
自己的文档字符串注释:
返回的计数通常比您预期的高一个,因为它包含(临时)引用作为getrefcount()的参数。
调用方法时的两个附加引用分别为:
self
持有的引用
a.print_ref_count
时(甚至在实际调用它之前)创建特定于该实例的绑定方法对象时创建的隐式引用; type(a.print_ref_count)
是一个临时绑定方法,必须包含对实例和方法本身的引用(您可以to_print = a.print_ref_count
,然后del a
,to_print
必须仍然可以工作虽然a
不再引用实例)挂起参考计数并不是很有帮助;它是Python的一个实现细节(特别是CPython;其他Python解释器可以并且确实使用非引用计数垃圾收集),正如您所看到的,创建了许多隐式引用,它们实际上可能根本不存储在命名变量中。