Подсчёт ссылок¶Reference Counting
Макросы в этом разделе используются для управления счётчиками ссылок на объекты Python.
-
void
Py_INCREF(PyObject *o)¶ Увеличивает счётчик ссылок для объекта o. Объект не должен быть NULL; если нет уверенности, что он не равен NULL, следует воспользоваться
Py_XINCREF().
-
void
Py_XINCREF(PyObject *o)¶ Увеличивает счётчик ссылок для объекта o. Объект может быть NULL; в этом случае макрос не имеет эффекта.
-
void
Py_DECREF(PyObject *o)¶ Уменьшает счётчик ссылок для объекта o. Объект не должен быть NULL; если нет уверенности, что он не равен NULL, следует воспользоваться
Py_XDECREF(). Если счётчик ссылок достигает нуля, вызывается функция освобождения типа объекта (которая не должна быть NULL).Предупреждение
Функция освобождения может вызвать выполнение произвольного кода Python (например, при освобождении экземпляра класса с методом
__del__()). Хотя исключения в таком коде не распространяются, выполняемый код имеет свободный доступ ко всем глобальным переменным Python. Это означает, что любой объект, достижимый из глобальной переменной, должен находиться в согласованном состоянии перед вызовомPy_DECREF(). Например, код, удаляющий объект из списка, должен скопировать ссылку на удаляемый объект во временную переменную, обновить структуру данных списка, а затем вызватьPy_DECREF()для временной переменной.
-
void
Py_XDECREF(PyObject *o)¶ Уменьшает счётчик ссылок для объекта o. Объект может быть NULL; в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для
Py_DECREF(), и применяется то же предупреждение.
-
void
Py_CLEAR(PyObject *o)¶ Уменьшает счётчик ссылок для объекта o. Объект может быть NULL; в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для
Py_DECREF(), за исключением того, что аргумент также устанавливается в NULL. Предупреждение дляPy_DECREF()не применяется к переданному объекту, поскольку макрос аккуратно использует временную переменную и устанавливает аргумент в NULL перед уменьшением его счётчика ссылок.Этот макрос рекомендуется использовать при уменьшении значения переменной, которая может быть затронута при сборке мусора.
Следующие функции предназначены для динамического встраивания Python во время выполнения:
Py_IncRef(PyObject *o), Py_DecRef(PyObject *o). Они представляют собой просто экспортированные версии функций
Py_XINCREF() и
Py_XDECREF() соответственно.
Следующие функции или макросы предназначены только для использования в ядре интерпретатора:
_Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference(),
а также глобальная переменная _Py_RefTotal.