这个PyList_Append(列表,Py_BuildValue(...))是否泄漏?

时间:2010-08-18 13:11:25

标签: python c

这是否泄漏?:

static PyObject* foo(PyObject* self, PyObject* args){
    PyObect* 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 个答案:

答案 0 :(得分:23)

PyList_Append确实增加了引用计数器,所以,是的,第一个例子会泄漏。 PyList_SetItem没有,这是一个奇怪的例外。

第二个选项会稍微提高效率,因为列表将被分配给正确的大小,Python必须在附加项目时动态调整大小。