refcounting.md
1> **Источник:** https://python-all.ru/3.9/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Увеличивает счётчик ссылок для объекта *o*. Объект не должен быть `NULL`; если нет уверенности, что он не `NULL`, используйте [`Py_XINCREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_XINCREF).1415#### `void Py_XINCREF(PyObject *o)`1617Увеличивает счётчик ссылок для объекта *o*. Объект может быть `NULL`, в этом случае макрос не имеет эффекта.1819#### `void Py_DECREF(PyObject *o)`2021Уменьшает счётчик ссылок для объекта *o*. Объект не должен быть `NULL`; если нет уверенности, что он не `NULL`, используйте [`Py_XDECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_XDECREF). Если счётчик ссылок достигает нуля, вызывается функция освобождения типа объекта (которая не должна быть `NULL`).2223> **Предупреждение**24>25> Функция освобождения может вызвать выполнение произвольного кода Python (например, при освобождении экземпляра класса с методом [`__del__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__del__)). Хотя исключения в таком коде не распространяются, выполняемый код имеет свободный доступ ко всем глобальным переменным Python. Это означает, что любой объект, достижимый из глобальной переменной, должен находиться в согласованном состоянии перед вызовом [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF). Например, код, удаляющий объект из списка, должен скопировать ссылку на удаляемый объект во временную переменную, обновить структуру данных списка, а затем вызвать [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF) для временной переменной.2627#### `void Py_XDECREF(PyObject *o)`2829Уменьшает счётчик ссылок для объекта *o*. Объект может быть `NULL`, в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF), и применяется то же предупреждение.3031#### `void Py_CLEAR(PyObject *o)`3233Уменьшает счётчик ссылок для объекта *o*. Объект может быть `NULL`, в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF), за исключением того, что аргумент также устанавливается в `NULL`. Предупреждение для [`Py_DECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_DECREF) не применяется к переданному объекту, потому что макрос аккуратно использует временную переменную и устанавливает аргумент в `NULL` перед уменьшением его счётчика ссылок.3435Рекомендуется использовать этот макрос всякий раз, когда уменьшается счётчик ссылок объекта, который может быть обойдён во время сборки мусора.3637Следующие функции предназначены для динамического встраивания Python во время выполнения: `Py_IncRef(PyObject *o)`, `Py_DecRef(PyObject *o)`. Они представляют собой просто экспортированные версии функций [`Py_XINCREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_XINCREF) и [`Py_XDECREF()`](https://python-all.ru/3.9/c-api/refcounting.html#c.Py_XDECREF) соответственно.3839Следующие функции или макросы предназначены только для использования в ядре интерпретатора: `_Py_Dealloc()`, `_Py_ForgetReference()`, `_Py_NewReference()`, а также глобальная переменная `_Py_RefTotal`.40