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