3. 参照カウント

この節のマクロは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であってはならない)が呼ばれます。

警告: (例えば__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() に 使うときの警告を気にしなくてすみます.

ガベージコレクション中に追跡される可能性のある変数の参照デクリメントを 行うには,このマクロを使うのがよいでしょう.

バージョン 2.4 で 新たに追加 された仕様です。

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

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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。