1 回答
TA贡献1817条经验 获得超6个赞
这会导致内存泄漏。
创建对象时,它的引用计数为1。对象只有在引用计数变为0时才会被删除。
第一个示例:将新对象传递给窃取引用(获得所有权)的函数(如)时,PyTuple_SetItem
refcount不会增加,因此仍为1。当元组最终被销毁并对其所有元素进行refref时,计数将降为0,因此将其销毁。一切都很好。
第三个示例:将新对象传递给不会窃取引用(创建新引用)的函数(如)时,PySequence_SetItem
refcount会增加,因此为2。当元组最终被销毁并对其所有元素进行refref时, count将下降到1,因此不会被销毁。而且,由于没有其他人可以引用它了(除非您将其存储在某个地方),所以任何人都无法对它进行解引用。所以它泄漏了。
第二个示例:将新对象传递给不会窃取引用(创建新引用)的函数(如),PySequence_SetItem
然后调用Py_DECREF
它时,refcount递增为2,然后递减为1。最终被销毁并对其所有元素进行refref,计数将降至0。一切都变好了。
如果您想知道为什么Python会同时具有任何非偷窃功能,那么您只需要考虑一个不那么琐碎的情况即可。
如果您想将该项目放入两个元组而不是一个中,该怎么办?或者,如果您想将其放在一个元组中,但又将其存储在C静态指针中,某个模块的全局变量中或其他地方?如果要将引用计数存储在两个位置,则希望将其增加2,而当您的局部变量消失时,引用计数将减少1。对于只是创建某些东西并立即将其移交的非常简单的情况,引用窃取函数使您可以避免单引号和一引号的使用,并且对单行代码很好用和方便。但是对于任何更复杂的事情,这都是没有意义的。
添加回答
举报