引用計數?

本節介紹的宏被用于管理 Python 對象的引用計數。

void Py_INCREF(PyObject *o)?

增加對象 o 的引用計數。

此函數通常被用來(lái)將 borrowed reference 原地轉換為 strong reference。 Py_NewRef() 函數可被用來(lái)創(chuàng )建新的 strong reference。

此對象必須不為 NULL;如果你不能確定它不為 NULL,請使用 Py_XINCREF()。

void Py_XINCREF(PyObject *o)?

增加對象 o 的引用計數。 對象可以為 NULL,在此情況下該宏不產(chǎn)生任何效果。

另請參閱 Py_XNewRef()。

PyObject *Py_NewRef(PyObject *o)?
Part of the Stable ABI since version 3.10.

新建指向一個(gè)對象的 strong reference: 增加對象 o 的引用計數并返回對象 o。

當不再需要這個(gè) strong reference 時(shí),應當在對象上調用 Py_DECREF() 來(lái)有減少該對象的引用計數。

對象 o 必須不為 NULL;如果 o 可以為 NULL 則應改用 Py_XNewRef()。

例如:

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

可以寫(xiě)成:

self->attr = Py_NewRef(obj);

另請參閱 Py_INCREF()。

3.10 新版功能.

PyObject *Py_XNewRef(PyObject *o)?
Part of the Stable ABI since version 3.10.

類(lèi)似于 Py_NewRef(),但對象 o 可以為 NULL。

如果對象 oNULL,該函數也·將返回 NULL。

3.10 新版功能.

void Py_DECREF(PyObject *o)?

減少對象 o 的引用計數。

如果引用計數達到零,則會(huì )發(fā)起調用對象類(lèi)型的撤銷(xiāo)分配函數 (該函數必須不為 NULL)。

此函數通常被用于在退出作用域之前刪除一個(gè) strong reference。

此對象必須不為 NULL;如果你不能確定它不為 NULL,請使用 Py_XDECREF()。

警告

釋放函數可導致任意 Python 代碼被發(fā)起調用(例如當一個(gè)帶有 __del__() 方法的類(lèi)實(shí)例被釋放時(shí)就是如此)。 雖然此類(lèi)代碼中的異常不會(huì )被傳播,但被執行的代碼能夠自由訪(fǎng)問(wèn)所有 Python 全局變量。 這意味著(zhù)任何可通過(guò)全局變量獲取的對象在 Py_DECREF() 被發(fā)起調用之前都應當處于完好狀態(tài)。 例如,從一個(gè)列表中刪除對象的代碼應當將被刪除對象的引用拷貝到一個(gè)臨時(shí)變量中,更新列表數據結構,然后再為臨時(shí)變量調用 Py_DECREF()。

void Py_XDECREF(PyObject *o)?

減少對象 o 的引用計數。 對象可以為 NULL,在此情況下該宏不產(chǎn)生任何效果;在其他情況下其效果與 Py_DECREF() 相同,并會(huì )應用同樣的警告。

void Py_CLEAR(PyObject *o)?

減少對象 o 的引用計數。 對象可以為 NULL,在此情況下該宏不產(chǎn)生任何效果;在其他情況下其效果與 Py_DECREF() 相同,區別在于其參數也會(huì )被設為 NULL。 針對 Py_DECREF() 的警告不適用于所傳遞的對象,因為該宏會(huì )細心地使用一個(gè)臨時(shí)變量并在減少其引用計數之前將參數設為 NULL。

每當要減少在垃圾回收期間可能會(huì )被遍歷的對象的引用計數時(shí),使用該宏是一個(gè)好主意。

void Py_IncRef(PyObject *o)?
Part of the Stable ABI.

Increment the reference count for object o. A function version of Py_XINCREF(). It can be used for runtime dynamic embedding of Python.

void Py_DecRef(PyObject *o)?
Part of the Stable ABI.

Decrement the reference count for object o. A function version of Py_XDECREF(). It can be used for runtime dynamic embedding of Python.