Вызывается ли этот PyList_Append (список, Py_BuildValue (...))?

Это утечка?:

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

PyList_Append действительно увеличивает счетчик ссылок, поэтому да, первый пример будет протекать. PyList_SetItem не делает это странным исключением.

Второй вариант будет немного более эффективным, потому что список будет выделен для правильного размера, и Python должен динамически изменять его размер по мере добавления элементов.