Документация Python неофициальный перевод

allocation.md

139 строк · 12.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/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#### `PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)`1819*Возвращаемое значение: заимствованная ссылка.*2021*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*2223Инициализирует недавно выделенный объект *op*, устанавливая его тип и начальную ссылку. Возвращает инициализированный объект. Остальные поля объекта не инициализируются. Несмотря на название, эта функция не связана с методом [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) объекта (слотом [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init)). В частности, эта функция **не** вызывает метод `__init__()` объекта.2425В целом считайте эту функцию низкоуровневой процедурой. Используйте [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc), где это возможно. Для реализации `tp_alloc` для вашего типа предпочтительнее [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc) или [`PyObject_New()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_New).2627> **Примечание**28>29> Эта функция инициализирует только ту память объекта, которая соответствует начальной структуре [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject). Остальная память не обнуляется.3031#### `PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)`3233*Возвращаемое значение: заимствованная ссылка.*3435*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*3637Эта функция делает всё то же, что и [`PyObject_Init()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_Init), а также инициализирует информацию о длине для объекта переменного размера.3839> **Примечание**40>41> Эта функция инициализирует только часть памяти объекта. Остальная память не обнуляется.4243#### `PyObject_New(TYPE, typeobj)`4445Выделяет новый объект Python, используя тип C-структуры *TYPE* и объект типа Python *typeobj* (`PyTypeObject*`), вызывая [`PyObject_Malloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Malloc) для выделения памяти и инициализируя его как [`PyObject_Init()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_Init). Вызывающий получает единственную ссылку на объект (т.е. его счётчик ссылок будет равен единице).4647Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.4849При заполнении слота [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа предпочтительнее использовать [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc), а не собственную функцию, которая просто вызывает этот макрос.5051Этот макрос не вызывает [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc), [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) ([`__new__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__new__)) или [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init) ([`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__)).5253Это нельзя использовать для объектов, у которых в [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC); вместо этого используйте [`PyObject_GC_New`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_New).5455Память, выделенная этим макросом, должна быть освобождена с помощью [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free) (обычно вызываемого через слот [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free) объекта).5657> **Примечание**58>59> Возвращаемая память не гарантированно полностью обнулена до инициализации.6061> **Примечание**62>63> Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init). Для создания полностью инициализированного объекта вместо этого вызывайте *typeobj*. Например:64>65> ```c66> PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);67> ```6869> **См. также**70>71> - [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free)72> - [`PyObject_GC_New`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_New)73> - [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc)74> - [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc)7576#### `PyObject_NewVar(TYPE, typeobj, size)`7778Как [`PyObject_New`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_New), за исключением:7980- Он выделяет достаточно памяти для структуры *TYPE* плюс *size* (`Py_ssize_t`) полей размером, задаваемым полем [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) структуры *typeobj*.81- Память инициализируется как [`PyObject_InitVar()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_InitVar).8283Это полезно для реализации таких объектов, как кортежи, которые могут определить свой размер во время создания. Встраивание массива полей в то же выделение памяти уменьшает количество выделений, повышая эффективность управления памятью.8485Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.8687При заполнении слота [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа предпочтительнее использовать [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc), а не собственную функцию, которая просто вызывает этот макрос.8889Это нельзя использовать для объектов, у которых в [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC); вместо этого используйте [`PyObject_GC_NewVar`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_NewVar).9091Память, выделенная этой функцией, должна быть освобождена с помощью [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free) (обычно вызываемого через слот [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free) объекта).9293> **Примечание**94>95> Возвращаемая память не гарантированно полностью обнулена до инициализации.9697> **Примечание**98>99> Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init). Для создания полностью инициализированного объекта вместо этого вызывайте *typeobj*. Например:100>101> ```c102> PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);103> ```104105> **См. также**106>107> - [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free)108> - [`PyObject_GC_NewVar`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_NewVar)109> - [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc)110> - [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc)111112#### `PyObject _Py_NoneStruct`113114Объект, который виден в Python как `None`. Доступ к нему следует получать только через макрос [`Py_None`](https://python-all.ru/3.16/c-api/none.html#c.Py_None), который вычисляет указатель на этот объект.115116> **См. также**117>118> **[Объекты модулей](https://python-all.ru/3.16/c-api/module.html#moduleobjects)**119>120> Для выделения памяти и создания модулей расширений.121122## Условно устаревшие псевдонимы123124[Условно устарело](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) с версии 3.15.125126Это псевдонимы существующих функций и макросов. Они существуют только для обратной совместимости.127128| Мягко устаревший псевдоним | Функция |129| --- | --- |130| PyObject\_NEW(type, typeobj) | [`PyObject_New`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_New) |131| PyObject\_NEW\_VAR(type, typeobj, n) | [`PyObject_NewVar`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_NewVar) |132| PyObject\_INIT(op, typeobj) | [`PyObject_Init()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_Init) |133| PyObject\_INIT\_VAR(op, typeobj, n) | [`PyObject_InitVar()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_InitVar) |134| PyObject\_MALLOC(n) | [`PyObject_Malloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Malloc) |135| PyObject\_REALLOC(p, n) | [`PyObject_Realloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Realloc) |136| PyObject\_FREE(p) | [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free) |137| PyObject\_DEL(p) | [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free) |138| PyObject\_Del(p) | [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free) |139