这个问题很简单,但有助于巩固我的理解。我知道 C 扩展函数的参数保证在 C 代码期间是实时引用(除非手动 DECREFed)。但是,如果我有一个 C 扩展代码返回其参数列表中存在的 PyObject*,我是否需要在返回它之前 INCREF 参数?即,以下两项哪一项是正确的:
static PyObject return_item(PyObject *self, PyObject *item)
{
// manipulate item
return item;
}
或者
static PyObject return_item(PyObject *self, PyObject *item)
{
// manipulate item
Py_INCREF(item);
return item;
}
基于https://docs.python.org/3/extending/extending.html#ownership-rules,其中说
从 Python 调用的 C 函数返回的对象引用必须是拥有的引用——所有权从函数转移到其调用者。
并将对象从 C 返回到 Python我认为是后者(INCREFing 是要走的路),但我想确定。
子衿沉夜
米琪卡哇伊
相关分类