VM 没有为引用计数调用特殊方法。引用计数是 CPython VM 的实现细节,在特定于实现的帮助程序之外不可见。
引用计数(Python 词汇表)
对对象的引用数。当一个对象的引用计数下降到零时,它就会被释放。引用计数通常对 Python 代码不可见,但它是 CPython 实现的关键元素。该sys
模块定义了一个getrefcount()
函数,程序员可以调用该函数来返回特定对象的引用计数。
CPython 在内部使用C 宏/函数来管理引用计数。对于 CPython 3.8,引用计数是一个 C 整数,省略调试操作引用计数定义为:
static inline void _Py_INCREF(PyObject *op)
{
op->ob_refcnt++;
}
获取引用只会增加引用计数。这纯粹是一个 C 递增操作,在增加引用计数时不能调用任何 Python 代码。
// omitting lineno/filename used for debug
static inline void _Py_DECREF(PyObject *op)
{
_Py_DEC_REFTOTAL;
if (--op->ob_refcnt != 0) {
}
else {
_Py_Dealloc(op);
}
}
释放引用会减少引用计数,并立即触发对未引用对象的取消分配。递减是纯粹的 C 递减操作,减少引用计数时不能调用任何 Python 代码。只有在将引用计数减为 0 后,才能_Py_Dealloc
最终通过__del__
.