重新计数 python 个对象

Refcount python objects

我想了解引用计数在 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

Python中到处都有隐式引用增量。当您将 a 作为参数传递给函数时,它会被增加,如 getrefcount 自己的文档字符串注释:

The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

调用方法时的两个附加引用分别是:

  1. 方法中名称 self 持有的引用
  2. 当您执行 a.print_ref_count 时(甚至在实际调用它之前)创建特定于该实例的绑定方法对象时创建的隐式引用; type(a.print_ref_count) 是一个临时绑定方法,它必须包括对实例和方法本身的引用(您可以先 to_print = a.print_ref_count,然后 del a,并且 to_print 必须仍然有效虽然 a 不再引用该实例)

尽管挂在引用计数上并不是很有用;它是 Python 的实现细节(特别是 CPython ;其他 Python 解释器可以并且确实使用非引用计数垃圾收集),正如您所见,创建了许多隐式引用实际上可能根本不存储在命名变量中。