参照カウント

この節のマクロはPythonオブジェクトの参照カウントを管理するために使われます。

void Py_INCREF(PyObject *o)

Increment the reference count for object o.

This function is usually used to convert a borrowed reference to a strong reference in-place. The Py_NewRef() function can be used to create a new strong reference.

The object must not be NULL; if you aren't sure that it isn't NULL, use Py_XINCREF().

void Py_XINCREF(PyObject *o)

オブジェクト o に対する参照カウントを一つ増やします。 オブジェクトが NULL であってもよく、その場合マクロは何の影響も与えません。

See also Py_XNewRef().

PyObject *Py_NewRef(PyObject *o)

Create a new strong reference to an object: increment the reference count of the object o and return the object o.

When the strong reference is no longer needed, Py_DECREF() should be called on it to decrement the object reference count.

The object o must not be NULL; use 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 Py_INCREF().

バージョン 3.10 で追加.

PyObject *Py_XNewRef(PyObject *o)

Similar to Py_NewRef(), but the object o can be NULL.

If the object o is NULL, the function just returns NULL.

バージョン 3.10 で追加.

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 strong reference before exiting its scope.

The object must not be NULL; if you aren't sure that it isn't NULL, use Py_XDECREF().

警告

(例えば __del__() メソッドをもつクラスインスタンスがメモリ解放されたときに)メモリ解放関数は任意のPythonコードを呼び出すことができます。このようなコードでは例外は伝播しませんが、実行されたコードはすべてのPythonグローバル変数に自由にアクセスできます。これが意味するのは、 Py_DECREF() が呼び出されるより前では、グローバル変数から到達可能などんなオブジェクトも一貫した状態にあるべきであるということです。例えば、リストからオブジェクトを削除するコードは削除するオブジェクトへの参照を一時変数にコピーし、リストデータ構造を更新し、それから一時変数に対して Py_DECREF() を呼び出すべきです。

void Py_XDECREF(PyObject *o)

オブジェクト o への参照カウントを一つ減らします。 オブジェクトは NULL でもかまいませんが、その場合マクロは何の影響も与えません。 それ以外の場合、結果は Py_DECREF() と同じです。 また、注意すべきことも同じです。

void Py_CLEAR(PyObject *o)

o の参照カウントを減らします。 オブジェクトは NULL でもよく、その場合このマクロは何も行いません。 オブジェクトが NULL でなければ、引数を NULL にした Py_DECREF() と同じ効果をもたらします。 このマクロは一時変数を使って、参照カウントをデクリメントする前に引数を NULL にセットしてくれるので、 Py_DECREF() に使うときの警告を気にしなくてすみます。

ガベージコレクション中に追跡される可能性のあるオブジェクトの参照カウントのデクリメントを行うには、このマクロを使うのがよいでしょう。

以下の関数: Py_IncRef(PyObject *o), Py_DecRef(PyObject *o), は、実行時の動的な Python 埋め込みで使われる関数です。これらの関数はそれぞれ Py_XINCREF() および Py_XDECREF() をエクスポートしただけです。

以下の関数やマクロ: _Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference() は、インタプリタのコアの内部においてのみ使用するためのものです。また、グローバル変数 _Py_RefTotal も同様です。