【发布时间】:2019-08-26 16:13:58
【问题描述】:
这个问题很简单,但有助于巩固我的理解。我知道 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 函数返回的对象引用必须是拥有的引用——所有权从函数转移到其调用者。
和Returning objects to Python from C 我认为是后者(INCREFing 是要走的路),但我想确定。
【问题讨论】:
标签: python python-c-api python-extensions