# 参照カウント

この節のマクロは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()` に使うときの警告を気にしなくてすみます。

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

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

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