1 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
這會(huì)導(dǎo)致內(nèi)存泄漏。
創(chuàng)建對(duì)象時(shí),它的引用計(jì)數(shù)為1。對(duì)象只有在引用計(jì)數(shù)變?yōu)?時(shí)才會(huì)被刪除。
第一個(gè)示例:將新對(duì)象傳遞給竊取引用(獲得所有權(quán))的函數(shù)(如)時(shí),PyTuple_SetItem
refcount不會(huì)增加,因此仍為1。當(dāng)元組最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref時(shí),計(jì)數(shù)將降為0,因此將其銷(xiāo)毀。一切都很好。
第三個(gè)示例:將新對(duì)象傳遞給不會(huì)竊取引用(創(chuàng)建新引用)的函數(shù)(如)時(shí),PySequence_SetItem
refcount會(huì)增加,因此為2。當(dāng)元組最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref時(shí), count將下降到1,因此不會(huì)被銷(xiāo)毀。而且,由于沒(méi)有其他人可以引用它了(除非您將其存儲(chǔ)在某個(gè)地方),所以任何人都無(wú)法對(duì)它進(jìn)行解引用。所以它泄漏了。
第二個(gè)示例:將新對(duì)象傳遞給不會(huì)竊取引用(創(chuàng)建新引用)的函數(shù)(如),PySequence_SetItem
然后調(diào)用Py_DECREF
它時(shí),refcount遞增為2,然后遞減為1。最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref,計(jì)數(shù)將降至0。一切都變好了。
如果您想知道為什么Python會(huì)同時(shí)具有任何非偷竊功能,那么您只需要考慮一個(gè)不那么瑣碎的情況即可。
如果您想將該項(xiàng)目放入兩個(gè)元組而不是一個(gè)中,該怎么辦?或者,如果您想將其放在一個(gè)元組中,但又將其存儲(chǔ)在C靜態(tài)指針中,某個(gè)模塊的全局變量中或其他地方?如果要將引用計(jì)數(shù)存儲(chǔ)在兩個(gè)位置,則希望將其增加2,而當(dāng)您的局部變量消失時(shí),引用計(jì)數(shù)將減少1。對(duì)于只是創(chuàng)建某些東西并立即將其移交的非常簡(jiǎn)單的情況,引用竊取函數(shù)使您可以避免單引號(hào)和一引號(hào)的使用,并且對(duì)單行代碼很好用和方便。但是對(duì)于任何更復(fù)雜的事情,這都是沒(méi)有意義的。
添加回答
舉報(bào)