Spec-Zone.ru › Python 3.11

Счетчик ссылок

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

void Py_INCREF(PyObject *o)

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

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

После завершения использования объекта освободите его, вызвав Py_DECREF().

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

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

void Py_XINCREF(PyObject *o)

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

См. также Py_XNewRef().

PyObject *Py_NewRef(PyObject *o)
Часть стабильной АПИ с версии 3.10.

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

Когда сильная ссылка больше не нужна, следует вызвать 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)
Часть стабильной АПИ с версии 3.10.

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

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

Введено в версии 3.10.

void Py_DECREF(PyObject *o)

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

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

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

Объект не должен быть 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)

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

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

void Py_IncRef(PyObject *o)
Часть стабильной АПИ.

Указывает на получение новой сильной ссылки на объект o. Функциональная версия Py_XINCREF(). Может использоваться для динамической встраивания Python во время выполнения.

void Py_DecRef(PyObject *o)
Часть стабильной АПИ.

Освободить сильную ссылку на объект o. Функциональная версия Py_XDECREF(). Может использоваться для динамической встраивания Python во время выполнения.

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

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/c-api/refcounting.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API