> **Источник:** https://python-all.ru/3.15/c-api/allocation.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Выделение объектов в куче

#### `PyObject *_PyObject_New(PyTypeObject *type)`

*Возвращаемое значение: новая ссылка.*

#### `PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)`

*Возвращаемое значение: новая ссылка.*

#### `PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)`

*Возвращаемое значение: заимствованная ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Инициализирует недавно выделенный объект *op*, устанавливая его тип и начальную ссылку. Возвращает инициализированный объект. Остальные поля объекта не инициализируются. Несмотря на название, эта функция не связана с методом [`__init__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__init__) объекта (слотом [`tp_init`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_init)). В частности, эта функция **не** вызывает метод `__init__()` объекта.

В целом считайте эту функцию низкоуровневой процедурой. Используйте [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc), где это возможно. Для реализации `tp_alloc` для вашего типа предпочтительнее [`PyType_GenericAlloc()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GenericAlloc) или [`PyObject_New()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_New).

> **Примечание**
>
> Эта функция инициализирует только ту память объекта, которая соответствует начальной структуре [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject). Остальная память не обнуляется.

#### `PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)`

*Возвращаемое значение: заимствованная ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Эта функция делает всё то же, что и [`PyObject_Init()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_Init), а также инициализирует информацию о длине для объекта переменного размера.

> **Примечание**
>
> Эта функция инициализирует только часть памяти объекта. Остальная память не обнуляется.

#### `PyObject_New(TYPE, typeobj)`

Выделяет новый объект Python, используя тип C-структуры *TYPE* и объект типа Python *typeobj* (`PyTypeObject*`), вызывая [`PyObject_Malloc()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Malloc) для выделения памяти и инициализируя его как [`PyObject_Init()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_Init). Вызывающий получает единственную ссылку на объект (т.е. его счётчик ссылок будет равен единице).

Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.

При заполнении слота [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа предпочтительнее использовать [`PyType_GenericAlloc()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GenericAlloc), а не собственную функцию, которая просто вызывает этот макрос.

Этот макрос не вызывает [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc), [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new) ([`__new__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__new__)) или [`tp_init`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_init) ([`__init__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__init__)).

Это нельзя использовать для объектов, у которых в [`tp_flags`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC); вместо этого используйте [`PyObject_GC_New`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_New).

Память, выделенная этим макросом, должна быть освобождена с помощью [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) (обычно вызываемого через слот [`tp_free`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_free) объекта).

> **Примечание**
>
> Возвращаемая память не гарантированно полностью обнулена до инициализации.

> **Примечание**
>
> Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью [`tp_init`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_init). Для создания полностью инициализированного объекта вместо этого вызывайте *typeobj*. Например:
>
> ```c
> PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
> ```

> **См. также**
>
> - [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free)
> - [`PyObject_GC_New`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_New)
> - [`PyType_GenericAlloc()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GenericAlloc)
> - [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc)

#### `PyObject_NewVar(TYPE, typeobj, size)`

Как [`PyObject_New`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_New), за исключением:

- Он выделяет достаточно памяти для структуры *TYPE* плюс *size* (`Py_ssize_t`) полей размером, задаваемым полем [`tp_itemsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) структуры *typeobj*.
- Память инициализируется как [`PyObject_InitVar()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_InitVar).

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

Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.

При заполнении слота [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа предпочтительнее использовать [`PyType_GenericAlloc()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GenericAlloc), а не собственную функцию, которая просто вызывает этот макрос.

Это нельзя использовать для объектов, у которых в [`tp_flags`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC); вместо этого используйте [`PyObject_GC_NewVar`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_NewVar).

Память, выделенная этой функцией, должна быть освобождена с помощью [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) (обычно вызываемого через слот [`tp_free`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_free) объекта).

> **Примечание**
>
> Возвращаемая память не гарантированно полностью обнулена до инициализации.

> **Примечание**
>
> Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью [`tp_init`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_init). Для создания полностью инициализированного объекта вместо этого вызывайте *typeobj*. Например:
>
> ```c
> PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
> ```

> **См. также**
>
> - [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free)
> - [`PyObject_GC_NewVar`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_NewVar)
> - [`PyType_GenericAlloc()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GenericAlloc)
> - [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc)

#### `PyObject _Py_NoneStruct`

Объект, который виден в Python как `None`. Доступ к нему следует получать только через макрос [`Py_None`](https://python-all.ru/3.15/c-api/none.html#c.Py_None), который вычисляет указатель на этот объект.

> **См. также**
>
> **[Объекты модулей](https://python-all.ru/3.15/c-api/module.html#moduleobjects)**
>
> Для выделения памяти и создания модулей расширений.

## Условно устаревшие псевдонимы

[Условно устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15.

Это псевдонимы существующих функций и макросов. Они существуют только для обратной совместимости.

| Мягко устаревший псевдоним | Функция |
| --- | --- |
| PyObject\_NEW(type, typeobj) | [`PyObject_New`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_New) |
| PyObject\_NEW\_VAR(type, typeobj, n) | [`PyObject_NewVar`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_NewVar) |
| PyObject\_INIT(op, typeobj) | [`PyObject_Init()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_Init) |
| PyObject\_INIT\_VAR(op, typeobj, n) | [`PyObject_InitVar()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_InitVar) |
| PyObject\_MALLOC(n) | [`PyObject_Malloc()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Malloc) |
| PyObject\_REALLOC(p, n) | [`PyObject_Realloc()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Realloc) |
| PyObject\_FREE(p) | [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) |
| PyObject\_DEL(p) | [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) |
| PyObject\_Del(p) | [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) |
