Подсчёт ссылок

Макросы в этом разделе используются для управления счётчиком ссылок на объекты 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.