是否泄漏?:

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;
}

最佳答案

PyList_Append确实确实会增加引用计数器,因此,是的,第一个示例将泄漏。 PyList_SetItem没有,这使其成为一个奇怪的异常。

第二种选择会稍微有效率,因为列表将被分配为正确的大小,而Python确实必须在添加项时动态调整其大小。

关于python - 这个PyList_Append(list,Py_BuildValue(...))是否泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3512414/

10-09 08:43
查看更多