这个PyList_Append(list, Py_BuildValue(...))会泄漏吗?

26 投票
1 回答
7535 浏览
提问于 2025-04-16 02:58

这个会泄漏吗?:

static PyObject* foo(PyObject* self, PyObject* args){
    PyObject* list = PyList_New(0);
    for(int i = 0; i < 100; i++)
        // leak? does PyList_Append increment ref of the temporary?
        PyList_Append(list, Py_BuildValue("i", 42)); 
    return list;
}

不过,我想无论如何这样做可能更好吧?:

static PyObject* foo(PyObject* self, PyObject* args){
    PyObect* list = PyList_New(100);
    for(int i = 0; i < 100; i++)
        PyList_SetItem(list, i, Py_BuildValue("i", 42));
    return list;
}

1 个回答

32

PyList_Append 确实会增加引用计数,所以,第一个例子会导致内存泄漏。PyList_SetItem 不会增加引用计数,这让它显得有些特别。

第二种方法会稍微高效一些,因为列表会被分配到正好合适的大小,而不是在添加元素时,Python 需要动态调整大小。

撰写回答