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

Макросы в этом разделе используются для управления количеством ссылок на объекты Python.

void Py_INCREF(PyObject *o)

Укажите, что для объекта o используется новый strong reference, что указывает на то, что он используется и не должен быть уничтожен.

Эта функция обычно используется для преобразования borrowed reference в strong reference на месте. Функция Py_NewRef() может быть использована для создания нового strong reference.

Когда закончите использовать объект, освободите его, вызвав команду Py_DECREF().

Объект не должен быть NULL; если вы не уверены, что это не NULL, используйте Py_XINCREF().

Не ожидайте, что эта функция действительно каким-либо образом изменит o.

void Py_XINCREF(PyObject *o)

Аналогично Py_INCREF(), но объект o может быть NULL, и в этом случае это не имеет никакого эффекта.

Смотрите также Py_XNewRef().

PyObject *Py_NewRef(PyObject *o)
Part of the Стабильный ABI since version 3.10.

Создайте новый strong reference для объекта: вызовите Py_INCREF() на o и верните объект o.

Когда strong reference больше не нужен, для него следует вызвать Py_DECREF(), чтобы освободить ссылку.

Объект o не должен быть NULL; используйте Py_XNewRef(), если o может быть NULL.

Например:

Py_INCREF(obj);
self->attr = obj;

может быть записано как:

self->attr = Py_NewRef(obj);

Смотрите также Py_INCREF().

Добавлено в версии 3.10.

PyObject *Py_XNewRef(PyObject *o)
Part of the Стабильный ABI since version 3.10.

Аналогично Py_NewRef(), но объект o может быть нулевым.

Если объект o равен NULL, функция просто возвращает NULL.

Добавлено в версии 3.10.

void Py_DECREF(PyObject *o)

Отпустите клавишу strong reference для обозначения объекта o, указывая, что ссылка больше не используется.

Как только последний strong reference будет освобожден (т.е. количество ссылок на объект достигнет 0), вызывается функция освобождения типа объекта (которая не должна быть NULL).

Эта функция обычно используется для удаления strong reference перед выходом из области видимости.

Объект не должен быть NULL; если вы не уверены, что это не NULL, используйте Py_XDECREF().

Не ожидайте, что эта функция действительно каким-либо образом изменит o.

Предупреждение

Функция освобождения может вызвать вызов произвольного кода Python (например, когда освобождается экземпляр класса с методом __del__()). Хотя исключения в таком коде не распространяются, выполняемый код имеет свободный доступ ко всем глобальным переменным Python. Это означает, что любой объект, доступный из глобальной переменной, должен находиться в согласованном состоянии до вызова Py_DECREF(). Например, код для удаления объекта из списка должен скопировать ссылку на удаленный объект во временную переменную, обновить структуру данных списка, а затем вызвать Py_DECREF() для временной переменной.

void Py_XDECREF(PyObject *o)

Аналогично Py_DECREF(), но объект o может быть NULL, и в этом случае это не имеет никакого эффекта. То же предупреждение из Py_DECREF() применимо и здесь.

void Py_CLEAR(PyObject *o)

Отпустите strong reference для объекта o. Объектом может быть NULL, в этом случае макрос не имеет эффекта; в противном случае эффект такой же, как для Py_DECREF(), за исключением того, что аргументу также присвоено значение NULL. Предупреждение для Py_DECREF() не применяется в отношении переданного объекта, поскольку макрос тщательно использует временную переменную и присваивает аргументу значение NULL перед освобождением ссылки.

Рекомендуется использовать этот макрос всякий раз, когда освобождается ссылка на объект, который может быть пройден во время сборки мусора.

void Py_IncRef(PyObject *o)
Part of the Стабильный ABI.

Укажите, что для объекта o используется новый strong reference. Версия функции Py_XINCREF(). Ее можно использовать для динамического встраивания Python во время выполнения.

void Py_DecRef(PyObject *o)
Part of the Стабильный ABI.

Освободите strong reference для object o. Версия функции Py_XDECREF(). Ее можно использовать для динамического встраивания Python во время выполнения.

Следующие функции или макросы предназначены только для использования в ядре интерпретатора: _Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference(), а также глобальная переменная _Py_RefTotal.

Вернуться на верх