PyObject_CallObject调用多次返回list个数变多
时间: 2023-08-12 20:04:01 浏览: 177
在使用 `PyObject_CallObject` 调用 Python 函数时,如果该函数返回一个 `list` 对象,多次调用该函数可能导致返回的 `list` 个数变多的情况。这是因为在 Python C API 中,对于返回值是 `list` 的函数,在每次调用时会返回一个新的 `list` 对象,而不是原来的 `list` 对象。
为了避免这种情况,可以将 `list` 对象转换为一个 C 数组,然后在 C 数组中进行操作,而不是直接在 Python 中进行操作。下面是示例代码:
```c
PyObject* pModule = PyImport_ImportModule("mymodule"); // 导入 Python 模块
PyObject* pFunc = PyObject_GetAttrString(pModule, "myfunc"); // 获取 Python 函数对象
PyObject* pArgs = PyTuple_New(1); // 创建参数元组
PyObject* pArg = Py_BuildValue("i", 123); // 创建整型参数值
PyTuple_SetItem(pArgs, 0, pArg); // 将参数值加入参数元组
PyObject* pRet = PyObject_CallObject(pFunc, pArgs); // 调用函数
if (PyList_Check(pRet)) {
int size = PyList_Size(pRet);
PyObject* pItem;
int i;
for (i = 0; i < size; i++) {
pItem = PyList_GetItem(pRet, i);
// 在 pItem 上进行操作
}
}
Py_DECREF(pModule);
Py_DECREF(pFunc);
Py_DECREF(pArgs);
Py_DECREF(pArg);
Py_DECREF(pRet);
```
在此示例代码中,我们首先判断返回值是否是 `list` 对象,如果是,则获取 `list` 的大小,并在 C 数组中进行操作。这样可以确保每次操作的都是同一个 `list` 对象。
阅读全文