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