| .. highlight:: c |
| |
| |
| .. _countingrefs: |
| |
| ****************** |
| Reference Counting |
| ****************** |
| |
| The functions and macros in this section are used for managing reference counts |
| of Python objects. |
| |
| |
| .. c:function:: Py_ssize_t Py_REFCNT(PyObject *o) |
| |
| Get the reference count of the Python object *o*. |
| |
| Use the :c:func:`Py_SET_REFCNT()` function to set an object reference count. |
| |
| .. versionchanged:: 3.11 |
| The parameter type is no longer :c:expr:`const PyObject*`. |
| |
| .. versionchanged:: 3.10 |
| :c:func:`Py_REFCNT()` is changed to the inline static function. |
| |
| |
| .. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) |
| |
| Set the object *o* reference counter to *refcnt*. |
| |
| .. versionadded:: 3.9 |
| |
| |
| .. c:function:: void Py_INCREF(PyObject *o) |
| |
| Increment the reference count for object *o*. |
| |
| This function is usually used to convert a :term:`borrowed reference` to a |
| :term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be |
| used to create a new :term:`strong reference`. |
| |
| The object must not be ``NULL``; if you aren't sure that it isn't |
| ``NULL``, use :c:func:`Py_XINCREF`. |
| |
| |
| .. c:function:: void Py_XINCREF(PyObject *o) |
| |
| Increment the reference count for object *o*. The object may be ``NULL``, in |
| which case the macro has no effect. |
| |
| See also :c:func:`Py_XNewRef`. |
| |
| |
| .. c:function:: PyObject* Py_NewRef(PyObject *o) |
| |
| Create a new :term:`strong reference` to an object: increment the reference |
| count of the object *o* and return the object *o*. |
| |
| When the :term:`strong reference` is no longer needed, :c:func:`Py_DECREF` |
| should be called on it to decrement the object reference count. |
| |
| The object *o* must not be ``NULL``; use :c:func:`Py_XNewRef` if *o* can be |
| ``NULL``. |
| |
| For example:: |
| |
| Py_INCREF(obj); |
| self->attr = obj; |
| |
| can be written as:: |
| |
| self->attr = Py_NewRef(obj); |
| |
| See also :c:func:`Py_INCREF`. |
| |
| .. versionadded:: 3.10 |
| |
| |
| .. c:function:: PyObject* Py_XNewRef(PyObject *o) |
| |
| Similar to :c:func:`Py_NewRef`, but the object *o* can be NULL. |
| |
| If the object *o* is ``NULL``, the function just returns ``NULL``. |
| |
| .. versionadded:: 3.10 |
| |
| |
| .. c:function:: void Py_DECREF(PyObject *o) |
| |
| Decrement the reference count for object *o*. |
| |
| If the reference count reaches zero, the object's type's deallocation |
| function (which must not be ``NULL``) is invoked. |
| |
| This function is usually used to delete a :term:`strong reference` before |
| exiting its scope. |
| |
| The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, |
| use :c:func:`Py_XDECREF`. |
| |
| .. warning:: |
| |
| The deallocation function can cause arbitrary Python code to be invoked (e.g. |
| when a class instance with a :meth:`__del__` method is deallocated). While |
| exceptions in such code are not propagated, the executed code has free access to |
| all Python global variables. This means that any object that is reachable from |
| a global variable should be in a consistent state before :c:func:`Py_DECREF` is |
| invoked. For example, code to delete an object from a list should copy a |
| reference to the deleted object in a temporary variable, update the list data |
| structure, and then call :c:func:`Py_DECREF` for the temporary variable. |
| |
| |
| .. c:function:: void Py_XDECREF(PyObject *o) |
| |
| Decrement the reference count for object *o*. The object may be ``NULL``, in |
| which case the macro has no effect; otherwise the effect is the same as for |
| :c:func:`Py_DECREF`, and the same warning applies. |
| |
| |
| .. c:function:: void Py_CLEAR(PyObject *o) |
| |
| Decrement the reference count for object *o*. The object may be ``NULL``, in |
| which case the macro has no effect; otherwise the effect is the same as for |
| :c:func:`Py_DECREF`, except that the argument is also set to ``NULL``. The warning |
| for :c:func:`Py_DECREF` does not apply with respect to the object passed because |
| the macro carefully uses a temporary variable and sets the argument to ``NULL`` |
| before decrementing its reference count. |
| |
| It is a good idea to use this macro whenever decrementing the reference |
| count of an object that might be traversed during garbage collection. |
| |
| .. versionchanged:: 3.12 |
| The macro argument is now only evaluated once. If the argument has side |
| effects, these are no longer duplicated. |
| |
| |
| .. c:function:: void Py_IncRef(PyObject *o) |
| |
| Increment the reference count for object *o*. A function version of :c:func:`Py_XINCREF`. |
| It can be used for runtime dynamic embedding of Python. |
| |
| |
| .. c:function:: void Py_DecRef(PyObject *o) |
| |
| Decrement the reference count for object *o*. A function version of :c:func:`Py_XDECREF`. |
| It can be used for runtime dynamic embedding of Python. |
| |
| |
| .. c:macro:: Py_SETREF(dst, src) |
| |
| Macro safely decrementing the `dst` reference count and setting `dst` to |
| `src`. |
| |
| As in case of :c:func:`Py_CLEAR`, "the obvious" code can be deadly:: |
| |
| Py_DECREF(dst); |
| dst = src; |
| |
| The safe way is:: |
| |
| Py_SETREF(dst, src); |
| |
| That arranges to set `dst` to `src` _before_ decrementing reference count of |
| *dst* old value, so that any code triggered as a side-effect of `dst` |
| getting torn down no longer believes `dst` points to a valid object. |
| |
| .. versionadded:: 3.6 |
| |
| .. versionchanged:: 3.12 |
| The macro arguments are now only evaluated once. If an argument has side |
| effects, these are no longer duplicated. |
| |
| |
| .. c:macro:: Py_XSETREF(dst, src) |
| |
| Variant of :c:macro:`Py_SETREF` macro that uses :c:func:`Py_XDECREF` instead |
| of :c:func:`Py_DECREF`. |
| |
| .. versionadded:: 3.6 |
| |
| .. versionchanged:: 3.12 |
| The macro arguments are now only evaluated once. If an argument has side |
| effects, these are no longer duplicated. |