参照カウント—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.10/c-api/refcounting
移動先:案内検索

参照カウント

このセクションのマクロは、Pythonオブジェクトの参照カウントを管理するために使用されます。

void Py_INCREF(PyObject *o)

オブジェクト o の参照カウントをインクリメントします。

この関数は通常、借用参照強力参照インプレースに変換するために使用されます。 Py_NewRef()関数を使用して、新しい強力な参照を作成できます。

オブジェクトはNULLであってはなりません。 NULLでないかどうかわからない場合は、 Py_XINCREF()を使用してください。

void Py_XINCREF(PyObject *o)

オブジェクト o の参照カウントをインクリメントします。 オブジェクトはNULLの場合があり、その場合、マクロは効果がありません。

Py_XNewRef()も参照してください。

PyObject *Py_NewRef(PyObject *o)

オブジェクトへの新しい強力な参照を作成します。オブジェクト o の参照カウントをインクリメントし、オブジェクト o を返します。

強力な参照が不要になったら、 Py_DECREF()を呼び出して、オブジェクト参照カウントをデクリメントする必要があります。

オブジェクト oNULLであってはなりません。 oNULLになる可能性がある場合は、 Py_XNewRef()を使用してください。

例えば:

Py_INCREF(obj);
self->attr = obj;

次のように書くことができます:

self->attr = Py_NewRef(obj);

Py_INCREF()も参照してください。

バージョン3.10の新機能。

PyObject *Py_XNewRef(PyObject *o)

Py_NewRef()に似ていますが、オブジェクト o はNULLにすることができます。

オブジェクト oNULLの場合、関数はNULLを返すだけです。

バージョン3.10の新機能。

void Py_DECREF(PyObject *o)

オブジェクト o の参照カウントをデクリメントします。

参照カウントがゼロに達すると、オブジェクトの型の割り当て解除関数(NULLであってはなりません)が呼び出されます。

この関数は通常、スコープを終了する前に強力な参照を削除するために使用されます。

オブジェクトはNULLであってはなりません。 NULLでないかどうかわからない場合は、 Py_XDECREF()を使用してください。

警告

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

void Py_XDECREF(PyObject *o)
オブジェクト o の参照カウントをデクリメントします。 オブジェクトはNULLの場合があり、その場合、マクロは効果がありません。 それ以外の場合、効果は Py_DECREF()の場合と同じであり、同じ警告が適用されます。
void Py_CLEAR(PyObject *o)

オブジェクト o の参照カウントをデクリメントします。 オブジェクトはNULLの場合があり、その場合、マクロは効果がありません。 それ以外の場合、引数がNULLに設定されていることを除いて、効果は Py_DECREF()の場合と同じです。 Py_DECREF()の警告は、渡されたオブジェクトには適用されません。マクロは一時変数を慎重に使用し、参照カウントを減らす前に引数をNULLに設定するためです。

ガベージコレクション中にトラバースされる可能性のあるオブジェクトの参照カウントをデクリメントするときは常に、このマクロを使用することをお勧めします。

次の関数は、Pythonのランタイム動的埋め込み用です:Py_IncRef(PyObject *o)Py_DecRef(PyObject *o)。 これらは、それぞれ Py_XINCREF()および Py_XDECREF()の単純にエクスポートされた関数バージョンです。

次の関数またはマクロは、インタープリターコア内でのみ使用されます:_Py_Dealloc()_Py_ForgetReference()_Py_NewReference()、およびグローバル変数_Py_RefTotal