参考计数

本节中的宏用于管理Python对象的引用计数。

void Py_INCREF(PyObject *o)

增加对象的引用计数 o

此函数通常用于将 borrowed reference 发送到 strong reference 就位。这个 Py_NewRef() 函数可用于创建新的 strong reference

该对象不能是 NULL ;如果您不确定它是否 NULL ,使用 Py_XINCREF()

void Py_XINCREF(PyObject *o)

增加对象的引用计数 o . 对象可能是 NULL 在这种情况下,宏没有效果。

另请参阅 Py_XNewRef()

PyObject *Py_NewRef(PyObject *o)

创建新的 strong reference 到对象:递增对象的引用计数 o 并返回该对象 o

strong reference 不再需要了, Py_DECREF() 应在其上调用以递减对象引用计数。

该对象 o 一定不能是 NULL ;使用 Py_XNewRef() 如果 o 可以是 NULL

例如::

Py_INCREF(obj);
self->attr = obj;

可以写成::

self->attr = Py_NewRef(obj);

另请参阅 Py_INCREF()

3.10 新版功能.

PyObject *Py_XNewRef(PyObject *o)

类似于 Py_NewRef() ,但对象 o 可以为空。

如果该对象 oNULL ,则该函数仅返回 NULL

3.10 新版功能.

void Py_DECREF(PyObject *o)

递减对象的引用计数 o

如果引用计数达到零,则对象的类型的释放函数(不能为 NULL )被调用。

此函数通常用于删除 strong reference 在离开它的范围之前。

该对象不能是 NULL ;如果您不确定它是否 NULL ,使用 Py_XDECREF()

警告

deallocation函数可以导致调用任意python代码(例如,当类实例具有 __del__() 方法被释放)。虽然此类代码中的异常不会传播,但执行的代码可以自由访问所有python全局变量。这意味着任何可以从全局变量访问的对象在 Py_DECREF() 被调用。例如,从列表中删除对象的代码应在临时变量中复制对已删除对象的引用,更新列表数据结构,然后调用 Py_DECREF() 对于临时变量。

void Py_XDECREF(PyObject *o)

减少对象的引用计数 o . 对象可能是 NULL ,在这种情况下,宏没有效果;否则效果与for相同 Py_DECREF() ,同样的警告也适用。

void Py_CLEAR(PyObject *o)

减少对象的引用计数 o . 对象可能是 NULL ,在这种情况下,宏没有效果;否则效果与for相同 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 .