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

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

参照カウント

このセクションのマクロは、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であってはなりません)が呼び出されます。

警告

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

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

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

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

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

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