Reference Counting

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

void Py_INCREF(PyObject *o)

增加对象o的引用计数。对象不能为NULL;如果您不确定它不是NULL,请使用Py_XINCREF()

void Py_XINCREF(PyObject *o)

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

void Py_DECREF(PyObject *o)

减少对象o的引用计数。对象不能为NULL;如果不确定它不是NULL,请使用Py_XDECREF()如果引用计数达到零,则调用对象的类型的取消分配函数(不能为NULL)。

警告

释放功能可以使任意的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 t4> * o)它们分别是Py_XINCREF()Py_XDECREF()的导出函数版本。

以下函数或宏仅在解释器核心内使用:_Py_Dealloc()_Py_ForgetReference()_Py_NewReference()作为全局变量_Py_RefTotal