繁体   English   中英

如何使用PyObjects数组扩展Python列表

[英]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;
}

但是列表或多或少只是围绕PyObject自身数组的包装。

那么是否有更好(或更快速)的方法来扩展该列表? 我没有在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM