[英]How to extend a Python list with an array of PyObjects
我正在尝试处理一个返回PyObject
数组的API,并且我想用其内容extend
现有的python list
。
到目前为止,我只是追加数组的每个项目:
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i;
for (i = 0 ; i < arrsize; i++) {
if (PyList_Append(alist, items[i]) == -1) {
return NULL;
}
}
return alist;
}
那么是否有更好(或更快速)的方法来扩展该列表? 我没有在Python-C-API中找到函数,并且由于PyList_Object
的过度分配,似乎很难创建一个新数组,然后对原始数组进行memcpy
然后将其分配给((PyList_Object *)alist)->ob_item
。
您的意图是实现或使用list.extend()
,但是
l.extend(items)
等于
l[len(l):] = items
这可以在python c api PyList_SetSlice
本身中完成,尽管您将需要创建新列表。 但这比调整每个追加列表的大小要好。
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i, len = PyList_GET_SIZE(alist);
PyObject *l = PyList_New(arrsize);
int r = PyList_SetSlice(alist, len, len + arrsize, l);
Py_CLEAR(l);
if (r == -1) {
return NULL;
}
for (i = 0 ; i < arrsize; i++) {
Py_INCREF(items[i]);
PyList_SET_ITEM(alist, len + i, items[i]);
}
return Py_INCREF(alist), alist;
}
此外,您在退货时失去了参考资料。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.