参考计数¶
本节中的宏用于管理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 可以为空。如果该对象 o 是
NULL
,则该函数仅返回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
.