重新计数 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().
调用方法时的两个附加引用分别是:
- 方法中名称
self
持有的引用
- 当您执行
a.print_ref_count
时(甚至在实际调用它之前)创建特定于该实例的绑定方法对象时创建的隐式引用; type(a.print_ref_count)
是一个临时绑定方法,它必须包括对实例和方法本身的引用(您可以先 to_print = a.print_ref_count
,然后 del a
,并且 to_print
必须仍然有效虽然 a
不再引用该实例)
尽管挂在引用计数上并不是很有用;它是 Python 的实现细节(特别是 CPython ;其他 Python 解释器可以并且确实使用非引用计数垃圾收集),正如您所见,创建了许多隐式引用实际上可能根本不存储在命名变量中。
我想了解引用计数在 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().
调用方法时的两个附加引用分别是:
- 方法中名称
self
持有的引用 - 当您执行
a.print_ref_count
时(甚至在实际调用它之前)创建特定于该实例的绑定方法对象时创建的隐式引用;type(a.print_ref_count)
是一个临时绑定方法,它必须包括对实例和方法本身的引用(您可以先to_print = a.print_ref_count
,然后del a
,并且to_print
必须仍然有效虽然a
不再引用该实例)
尽管挂在引用计数上并不是很有用;它是 Python 的实现细节(特别是 CPython ;其他 Python 解释器可以并且确实使用非引用计数垃圾收集),正如您所见,创建了许多隐式引用实际上可能根本不存储在命名变量中。