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