PyList_New
создает список, заполненный NULL
указателями.Вы должны установить все эти указатели, используя PyList_SetItem
перед отправкой списка обратно в Python или вызовом любых функций Python на нем.
PyList_Append
(и PyList_Insert
) действительно эквивалентны вызовуsomelist.append
(и somelist.insert
) из Python.Они изменяют размер списка для вас.Я не уверен на 100%, если они имеют какие-либо элементы NULL
, поэтому, вероятно, лучше не вызывать их в список, который вы составили из PyList_New
и который вы еще не полностью заполнили.То, что вы делаете (выделение списка с некоторыми NULL
указателями, а затем добавление его), безусловно, неправильно, так как указатели NULL
никогда не заполняются. Вместо этого вы должны просто использовать PyList_Append
и PyList_Insert
в построенном спискеиз пустого.Вы также можете вызвать list.extend
, чтобы добавить несколько элементов в список одновременно - прямого доступа к этому через API C нет, но вы можете вызвать его через PyObject_CallMethodObjArgs
или аналогичный.
Внутренне список распределяетсябольше места, чем нужно, нужно лишь иногда перераспределять.Вы не можете это контролировать.