Подсчёт ссылок¶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 до уменьшения его счётчика ссылок.
Этот макрос рекомендуется использовать при уменьшении значения переменной, которая может быть затронута при сборке мусора.
Новое в версии 2.4.
Следующие функции предназначены для динамического встраивания Python во время выполнения: Py_IncRef(PyObject *o), Py_DecRef(PyObject *o). Они являются просто экспортируемыми версиями функций Py_XINCREF() и Py_XDECREF() соответственно.
Следующие функции или макросы предназначены только для использования в ядре интерпретатора: _Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference(), а также глобальная переменная _Py_RefTotal.