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_XINCREF()を使いなさい。 もし参照回数が零に達したら、オブジェクトの型の解放処理関数(これは NULLであってはならない)が呼び出される。

警告: 解放処理関数によって任意のPythonコードが呼び出され得る (例えば__del__()メソッドを持つクラスインスタンスが 解放されたとき)。そのようなコード中での例外が伝搬されない一方、 実行されたコードは全てのPythonの大域変数を自由に利用する。 これは、大域変数から到達可能などのオブジェクトは Py_DECREF()が呼ばれる前に整合の取れた状態に あるべきことを意味する。 例えば、リストからオブジェクトを削除するためのコードは、 一時変数に削除したオブジェクトへの参照をコピーして、 リストのデータ構造を更新して、そして一時変数に対して Py_DECREF()を呼ぶべきである。

void Py_XDECREF (PyObject *o)
オブジェクトoの参照回数を減らす。オブジェクトは NULLであってもよく、その場合マクロは何の効果もない。 そうでなければその効果はPy_DECREF()と同じであり、 同じ警告があてはまる。

以下の関数・マクロはインタープリタの中核のなかで使うためだけである: _Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference(), そして大域変数_Py_RefTotalもである。