引用計(jì)數(shù)?
本節(jié)介紹的宏被用于管理 Python 對象的引用計(jì)數(shù)。
-
void
Py_INCREF(PyObject?*o)? 增加對象 o 的引用計(jì)數(shù)。 對象必須不為
NULL;如果你不確定它不為NULL,可使用Py_XINCREF()。
-
void
Py_DECREF(PyObject?*o)? 減少對象 o 的引用計(jì)數(shù)。 對象必須不為
NULL;如果你不確定它不為NULL,可使用Py_XDECREF()。 如果引用計(jì)數(shù)降為零,將發(fā)起調(diào)用對象所屬類型的釋放函數(shù) (它必須不為NULL)。警告
釋放函數(shù)可導(dǎo)致任意 Python 代碼被發(fā)起調(diào)用(例如當(dāng)一個(gè)帶有
__del__()方法的類實(shí)例被釋放時(shí)就是如此)。 雖然此類代碼中的異常不會(huì)被傳播,但被執(zhí)行的代碼能夠自由訪問所有 Python 全局變量。 這意味著任何可通過全局變量獲取的對象在Py_DECREF()被發(fā)起調(diào)用之前都應(yīng)當(dāng)處于完好狀態(tài)。 例如,從一個(gè)列表中刪除對象的代碼應(yīng)當(dāng)將被刪除對象的引用拷貝到一個(gè)臨時(shí)變量中,更新列表數(shù)據(jù)結(jié)構(gòu),然后再為臨時(shí)變量調(diào)用Py_DECREF()。
-
void
Py_XDECREF(PyObject?*o)? 減少對象 o 的引用計(jì)數(shù)。 對象可以為
NULL,在此情況下該宏不產(chǎn)生任何效果;在其他情況下其效果與Py_DECREF()相同,并會(huì)應(yīng)用同樣的警告。
-
void
Py_CLEAR(PyObject?*o)? 減少對象 o 的引用計(jì)數(shù)。 對象可以為
NULL,在此情況下該宏不產(chǎn)生任何效果;在其他情況下其效果與Py_DECREF()相同,區(qū)別在于其參數(shù)也會(huì)被設(shè)為NULL。 針對Py_DECREF()的警告不適用于所傳遞的對象,因?yàn)樵摵陼?huì)細(xì)心地使用一個(gè)臨時(shí)變量并在減少其引用計(jì)數(shù)之前將參數(shù)設(shè)為NULL。當(dāng)要減少在垃圾回收期間可能會(huì)被遍歷的變量的值時(shí),使用該宏是一個(gè)好主意。
以下函數(shù)適用于 Python 的運(yùn)行時(shí)動(dòng)態(tài)嵌入: Py_IncRef(PyObject *o), Py_DecRef(PyObject *o)。 它們分別只是 Py_XINCREF() 和 Py_XDECREF() 的簡單導(dǎo)出函數(shù)版本。
以下函數(shù)或宏僅可在解釋器核心內(nèi)部使用: _Py_Dealloc(), _Py_ForgetReference(), _Py_NewReference() 以及全局變量 _Py_RefTotal。
