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

refcounting.md

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

1> **Источник:** https://python-all.ru/3.0/c-api/refcounting.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Подсчёт ссылок89Макросы в этом разделе используются для управления счётчиками ссылок на объекты Python.1011**\[Py\_INCREF\]void `Py_INCREF`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**1213Увеличивает счётчик ссылок объекта1415*o*1617. Объект не должен быть1819*NULL*2021; если нет уверенности, что он не2223*NULL*2425, используйте2627[`Py_XINCREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_XINCREF)2829.3031**\[Py\_XINCREF\]void `Py_XINCREF`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**3233Увеличивает счётчик ссылок для объекта3435*o*3637. Объект может быть3839*NULL*4041; в этом случае макрос не имеет эффекта.4243**\[Py\_DECREF\]void `Py_DECREF`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**4445Уменьшает счётчик ссылок объекта *o*. Объект не должен быть *NULL*; если нет уверенности, что он не *NULL*, используйте [`Py_XDECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_XDECREF). Если счётчик ссылок достигает нуля, вызывается функция освобождения памяти типа объекта (которая не должна быть *NULL*).4647> **Предупреждение**48>49> Функция освобождения может вызвать произвольный код Python (например, когда освобождается экземпляр класса с методом [`__del__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__del__)). Хотя исключения в таком коде не распространяются, выполняемый код имеет свободный доступ ко всем глобальным переменным Python. Это означает, что любой объект, доступный из глобальной переменной, должен находиться в согласованном состоянии до вызова [`Py_DECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_DECREF). Например, код для удаления объекта из списка должен скопировать ссылку на удаляемый объект во временную переменную, обновить структуру данных списка, а затем вызвать [`Py_DECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_DECREF) для временной переменной.5051**\[Py\_XDECREF\]void `Py_XDECREF`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**5253Уменьшает счётчик ссылок объекта5455*o*5657. Объект может быть5859*NULL*6061; в этом случае макрос не действует; в противном случае эффект такой же, как у6263[`Py_DECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_DECREF)6465, и применяется то же предупреждение.6667**\[Py\_CLEAR\]void `Py_CLEAR`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**6869Уменьшает счётчик ссылок объекта *o*. Объект может быть *NULL*; в этом случае макрос не действует; в противном случае эффект такой же, как у [`Py_DECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_DECREF), за исключением того, что аргумент также устанавливается в *NULL*. Предупреждение для [`Py_DECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_DECREF) не применяется к переданному объекту, потому что макрос аккуратно использует временную переменную и устанавливает аргумент в *NULL* перед уменьшением его счётчика ссылок.7071Этот макрос рекомендуется использовать при уменьшении значения переменной, которая может быть затронута при сборке мусора.7273Следующие функции предназначены для динамического внедрения Python во время выполнения: `Py_IncRef(PyObject *o)`, `Py_DecRef(PyObject *o)`. Они представляют собой просто экспортированные версии функций [`Py_XINCREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_XINCREF) и [`Py_XDECREF`](https://python-all.ru/3.0/c-api/refcounting.html#Py_XDECREF) соответственно.7475Следующие функции или макросы предназначены только для использования внутри ядра интерпретатора: `_Py_Dealloc`, `_Py_ForgetReference`, `_Py_NewReference`, а также глобальная переменная `_Py_RefTotal`.76