引用计数 — Python 文档
引用计数
本节中的宏用于管理 Python 对象的引用计数。
- void Py_INCREF(PyObject *o)
增加对象 o 的引用计数。
此函数通常用于将 借用引用 就地转换为 强引用 。 Py_NewRef() 函数可用于创建新的 强引用 。
对象不能是
NULL
; 如果您不确定它不是NULL
,请使用 Py_XINCREF()。
- void Py_XINCREF(PyObject *o)
增加对象 o 的引用计数。 对象可能是
NULL
,在这种情况下宏不起作用。另见 Py_XNewRef()。
- PyObject *Py_NewRef(PyObject *o)
为对象创建一个新的 强引用 :增加对象 o 的引用计数并返回对象 o。
当不再需要 强引用 时,应在其上调用 Py_DECREF() 以减少对象引用计数。
对象 o 不能是
NULL
; 如果 o 可以是NULL
,则使用 Py_XNewRef()。例如:
Py_INCREF(obj); self->attr = obj;
可以写成:
self->attr = Py_NewRef(obj);
另见 Py_INCREF()。
3.10 版中的新功能。
- PyObject *Py_XNewRef(PyObject *o)
类似于 Py_NewRef(),但对象 o 可以为 NULL。
如果对象 o 是
NULL
,则函数只返回NULL
。3.10 版中的新功能。
- void Py_DECREF(PyObject *o)
减少对象 o 的引用计数。
如果引用计数达到零,则调用对象类型的释放函数(不能是
NULL
)。此函数通常用于在退出其作用域之前删除 强引用 。
对象不能是
NULL
; 如果您不确定它不是NULL
,请使用 Py_XDECREF()。警告
释放函数可以导致任意 Python 代码被调用(例如 当具有
__del__()
方法的类实例被释放时)。 虽然此类代码中的异常不会传播,但执行的代码可以自由访问所有 Python 全局变量。 这意味着在调用 Py_DECREF() 之前,可从全局变量访问的任何对象都应处于一致状态。 例如,从列表中删除对象的代码应复制临时变量中对已删除对象的引用,更新列表数据结构,然后为临时变量调用 Py_DECREF()。
- void Py_XDECREF(PyObject *o)
- 减少对象 o 的引用计数。 对象可能是
NULL
,这种情况下宏不起作用; 否则效果与 Py_DECREF() 相同,并且相同的警告适用。
- void Py_CLEAR(PyObject *o)
减少对象 o 的引用计数。 对象可能是
NULL
,这种情况下宏不起作用; 否则效果与 Py_DECREF() 相同,只是参数也设置为NULL
。 Py_DECREF() 的警告不适用于传递的对象,因为宏小心地使用临时变量并将参数设置为NULL
,然后再减少其引用计数。每当减少垃圾回收期间可能遍历的对象的引用计数时,最好使用此宏。
以下函数用于 Python 的运行时动态嵌入:Py_IncRef(PyObject *o)
、Py_DecRef(PyObject *o)
。 它们分别是 Py_XINCREF() 和 Py_XDECREF() 的简单导出函数版本。
以下函数或宏仅用于解释器核心:_Py_Dealloc()
、_Py_ForgetReference()
、_Py_NewReference()
,以及全局变量_Py_RefTotal
。