Есть ли способ изменить размер списка Python с помощью API-интерфейса Python-C?

Мое C-приложение загружает dll интерпретатора Python и вызывает функцию list = PyList_New(len) создать новый список python размера 'len'.

Два вопроса:
1. Что произойдет, если я позвоню PyList_Append(list, item) больше, чем len раз? Я предполагаю, что это должно вызвать исключение. Правильно ли мое понимание?

2. Что важнее, мой второй вопрос: есть ли способ изменить размер списка? Я посмотрел на API C по адресу: https://docs.python.org/2/c-api/list.html, но не смог найти такой API. Любые предложения / комментарии / обходной путь?

Контекст моего вопроса заключается в том, что мне нужно создать список намного раньше, чем когда известны элементы списка и их количество.

1 ответ

PyList_New создает список воли NULL указатели. Вы должны установить все эти указатели, используя PyList_SetItem перед отправкой списка обратно в Python или вызовом каких-либо функций Python на нем.

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

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

Другие вопросы по тегам