Подсчёт ссылок¶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.