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

refcounting.md

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

1> **Источник:** https://python-all.ru/3.11/c-api/refcounting.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Подсчёт ссылок89Макросы в этом разделе используются для управления счётчиками ссылок на объекты Python.1011#### `void Py_INCREF(PyObject *o)`1213Указывает на создание новой [сильной ссылки](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект *o*, показывая, что он используется и не должен быть уничтожен.1415Эта функция обычно используется для преобразования [заимствованной ссылки](https://python-all.ru/3.11/glossary.html#term-borrowed-reference) в [сильную ссылку](https://python-all.ru/3.11/glossary.html#term-strong-reference) на месте. Функция [`Py_NewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_NewRef) может использоваться для создания новой [сильной ссылки](https://python-all.ru/3.11/glossary.html#term-strong-reference).1617Когда объект больше не нужен, освободите его, вызвав [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF).1819Объект не должен быть `NULL`; если нет уверенности, что он не `NULL`, используйте [`Py_XINCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XINCREF).2021Не следует ожидать, что эта функция действительно изменит *o* каким-либо образом.2223#### `void Py_XINCREF(PyObject *o)`2425Аналогично [`Py_INCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_INCREF), но объект *o* может быть `NULL`, в этом случае функция не действует.2627См. также [`Py_XNewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XNewRef).2829#### `PyObject *Py_NewRef(PyObject *o)`3031*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*3233Создаёт новую [сильную ссылку](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект: вызывает [`Py_INCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_INCREF) для *o* и возвращает объект *o*.3435Когда [сильная ссылка](https://python-all.ru/3.11/glossary.html#term-strong-reference) больше не нужна, для её освобождения следует вызвать [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF).3637Объект *o* не должен быть `NULL`; используйте [`Py_XNewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XNewRef), если *o* может быть `NULL`.3839Например:4041```c42Py_INCREF(obj);43self->attr = obj;44```4546можно записать как:4748```c49self->attr = Py_NewRef(obj);50```5152См. также [`Py_INCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_INCREF).5354Новое в версии 3.10.5556#### `PyObject *Py_XNewRef(PyObject *o)`5758*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*5960Аналогично [`Py_NewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_NewRef), но объект *o* может быть NULL.6162Если объект *o* равен `NULL`, функция просто возвращает `NULL`.6364Новое в версии 3.10.6566#### `void Py_DECREF(PyObject *o)`6768Освобождает [сильную ссылку](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект *o*, показывая, что ссылка больше не используется.6970Когда последняя [сильная ссылка](https://python-all.ru/3.11/glossary.html#term-strong-reference) освобождена (т.е. счётчик ссылок объекта достигает 0), вызывается функция освобождения типа объекта (которая не должна быть `NULL`).7172Эта функция обычно используется для удаления [сильной ссылки](https://python-all.ru/3.11/glossary.html#term-strong-reference) перед выходом из области видимости.7374Объект не должен быть `NULL`; если нет уверенности, что он не `NULL`, используйте [`Py_XDECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XDECREF).7576Не следует ожидать, что эта функция действительно изменит *o* каким-либо образом.7778> **Предупреждение**79>80> Функция освобождения может вызвать выполнение произвольного кода Python (например, при освобождении экземпляра класса с методом [`__del__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__del__)). Хотя исключения в таком коде не распространяются, выполняемый код имеет свободный доступ ко всем глобальным переменным Python. Это означает, что любой объект, достижимый из глобальной переменной, должен находиться в согласованном состоянии перед вызовом [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF). Например, код, удаляющий объект из списка, должен скопировать ссылку на удаляемый объект во временную переменную, обновить структуру данных списка, а затем вызвать [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF) для временной переменной.8182#### `void Py_XDECREF(PyObject *o)`8384Аналогично [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF), но объект *o* может быть `NULL`, в этом случае функция не имеет эффекта. Предупреждение из [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF) применимо и здесь.8586#### `void Py_CLEAR(PyObject *o)`8788Освобождает [сильную ссылку](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект *o*. Объект может быть `NULL`, в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF), за исключением того, что аргумент также устанавливается в `NULL`. Предупреждение для [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF) не применяется к переданному объекту, потому что макрос осторожно использует временную переменную и устанавливает аргумент в `NULL` перед освобождением ссылки.8990Рекомендуется использовать этот макрос всякий раз, когда освобождается ссылка на объект, который может быть обойдён во время сборки мусора.9192#### `void Py_IncRef(PyObject *o)`9394*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*9596Указывает на получение новой [сильной ссылки](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект *o*. Функциональная версия [`Py_XINCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XINCREF). Может использоваться для динамического встраивания Python во время выполнения.9798#### `void Py_DecRef(PyObject *o)`99100*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*101102Освобождает [сильную ссылку](https://python-all.ru/3.11/glossary.html#term-strong-reference) на объект *o*. Функциональная версия [`Py_XDECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XDECREF). Может использоваться для динамического встраивания Python во время выполнения.103104Следующие функции или макросы предназначены только для использования в ядре интерпретатора: `_Py_Dealloc()`, `_Py_ForgetReference()`, `_Py_NewReference()`, а также глобальная переменная `_Py_RefTotal`.105