这会泄漏吗?:
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;
}
Run Code Online (Sandbox Code Playgroud)
虽然,我认为最好这样做,无论如何?:
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;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ach 24
PyList_Append确实增加了引用计数器,所以,是的,第一个例子会泄漏. PyList_SetItem没有,使它成为一个奇怪的例外.
第二个选项会稍微提高效率,因为列表将被分配给正确的大小,Python必须在附加项目时动态调整大小.