allocation.md
1> **Источник:** https://python-all.ru/2.7/c-api/allocation.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Выделение объектов в куче89#### `PyObject* _PyObject_New(PyTypeObject *type)`1011*Возвращаемое значение: новая ссылка.*1213#### `PyVarObject* _PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)`1415*Возвращаемое значение: новая ссылка.*1617Изменено в версии 2.5: Эта функция использовала тип `int` для *size*. Это может потребовать изменений в коде для корректной поддержки 64-битных систем.1819#### `void _PyObject_Del(PyObject *op)`2021#### `PyObject* PyObject_Init(PyObject *op, PyTypeObject *type)`2223*Возвращаемое значение: заимствованная ссылка.*2425Инициализирует только что выделенный объект *op*, устанавливая его тип и начальную ссылку. Возвращает инициализированный объект. Если *type* указывает, что объект участвует в детекторе циклического мусора, он добавляется в набор наблюдаемых объектов детектора. Остальные поля объекта не затрагиваются.2627#### `PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)`2829*Возвращаемое значение: заимствованная ссылка.*3031Эта функция делает всё то же, что и [`PyObject_Init()`](https://python-all.ru/2.7/c-api/allocation.html#c.PyObject_Init), а также инициализирует информацию о длине для объекта переменного размера.3233Изменено в версии 2.5: Эта функция использовала тип `int` для *size*. Это может потребовать изменений в коде для корректной поддержки 64-битных систем.3435#### `TYPE* PyObject_New(TYPE, PyTypeObject *type)`3637*Возвращаемое значение: новая ссылка.*3839Выделяет новый объект Python с помощью типа структуры C *TYPE* и объекта типа Python *type*. Поля, не определённые заголовком объекта Python, не инициализируются; счётчик ссылок объекта будет равен единице. Размер выделяемой памяти определяется из поля [`tp_basicsize`](https://python-all.ru/2.7/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) объекта типа.4041#### `TYPE* PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)`4243*Возвращаемое значение: новая ссылка.*4445Выделяет новый объект Python с помощью C-структуры *TYPE* и объекта типа Python *type*. Поля, не определённые заголовком объекта Python, не инициализируются. Выделенная память рассчитана на структуру *TYPE* плюс *size* полей размером, задаваемым полем [`tp_itemsize`](https://python-all.ru/2.7/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) из *type*. Это удобно для реализации таких объектов, как кортежи, которые могут определять свой размер во время создания. Встраивание массива полей в ту же область выделения уменьшает число выделений, повышая эффективность управления памятью.4647Изменено в версии 2.5: Эта функция использовала тип `int` для *size*. Это может потребовать изменений в коде для корректной поддержки 64-битных систем.4849#### `void PyObject_Del(PyObject *op)`5051Освобождает память, выделенную объекту с помощью [`PyObject_New()`](https://python-all.ru/2.7/c-api/allocation.html#c.PyObject_New) или [`PyObject_NewVar()`](https://python-all.ru/2.7/c-api/allocation.html#c.PyObject_NewVar). Обычно вызывается из [`tp_dealloc`](https://python-all.ru/2.7/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) обработчика, указанного в типе объекта. После этого вызова поля объекта не должны использоваться, так как память больше не является допустимым объектом Python.5253#### `PyObject* Py_InitModule(char *name, PyMethodDef *methods)`5455*Возвращаемое значение: заимствованная ссылка.*5657Создаёт новый объект модуля на основе имени и таблицы функций, возвращая новый объект модуля.5859Изменено в версии 2.3: Более старые версии Python не поддерживали *NULL* в качестве значения для аргумента *methods*.6061#### `PyObject* Py_InitModule3(char *name, PyMethodDef *methods, char *doc)`6263*Возвращаемое значение: заимствованная ссылка.*6465Создаёт новый объект модуля на основе имени и таблицы функций, возвращая новый объект модуля. Если *doc* не равен *NULL*, он будет использован для определения строки документации модуля.6667Изменено в версии 2.3: Более старые версии Python не поддерживали *NULL* в качестве значения для аргумента *methods*.6869#### `PyObject* Py_InitModule4(char *name, PyMethodDef *methods, char *doc, PyObject *self, int apiver)`7071*Возвращаемое значение: заимствованная ссылка.*7273Создаёт новый объект модуля на основе имени и таблицы функций, возвращая новый объект модуля. Если *doc* не равен *NULL*, он будет использован для определения строки документации модуля. Если *self* не равен *NULL*, он будет передан функциям модуля в качестве их (в противном случае *NULL*) первого параметра. (Это было добавлено как экспериментальная возможность, и на данный момент нет известных случаев использования в текущей версии Python.) Для *apiver* единственное значение, которое следует передавать, определяется константой `PYTHON_API_VERSION`.7475> **Примечание**76>77> В большинстве случаев вместо этой функции следует использовать [`Py_InitModule3()`](https://python-all.ru/2.7/c-api/allocation.html#c.Py_InitModule3); используйте её, только если уверены, что она нужна.7879Изменено в версии 2.3: Более старые версии Python не поддерживали *NULL* в качестве значения для аргумента *methods*.8081**[PyObject](https://python-all.ru/2.7/c-api/structures.html#c.PyObject) `_Py_NoneStruct`**8283Объект, видимый в Python как `None`. Доступ к нему следует осуществлять только с помощью макроса `Py_None`, который возвращает указатель на этот объект.84