在 C/C++ Python 的扩展中,返回的 PyObject* 应该有多少引用计数?
In C/C++ extensions to Python, what reference count should a returned PyObject* have?
假设您为 python 编写了一个 C++(或 C)扩展,名为 module
。它 returns 一个数组的数组。返回的数组及其数组应该有什么作为引用计数?
python 代码类似于
import my_module
from sys import getrefcount as g # will use to check reference count
def use_module():
x = my_module.func()
print 'x =', x
print 'g(x) =', g(x)
print 'g(x[0]) =', g(x[0])
test = 'some random thing'
print 'should be', g(test), '?'
use_module()
>>> x = ( (1,2,3,4) , [2,3] , {'one':1} )
>>> g(x) = 3
>>> g(x[0]) = 3
>>> should be 2 ?
我希望 g(x)
是 2
,而不是 3
。 (在为 g
添加一个以参考 x
之后)
在我的 C++ 扩展中,我已经确保数组及其所有子集合及其元素在返回到 python 之前具有 1
的引用计数,所以我没有确定它是如何迅速飙升至 3
的?也许返回的 PyObject*
应该有 0
作为它的引用计数?
编辑:对不起,我是个白痴。我在不知情的情况下又做了一个参考[=23=]
如果不存在对返回对象的其他引用,则引用计数应为 1。如果引用计数为 0,则对象将被释放。
假设您为 python 编写了一个 C++(或 C)扩展,名为 module
。它 returns 一个数组的数组。返回的数组及其数组应该有什么作为引用计数?
python 代码类似于
import my_module
from sys import getrefcount as g # will use to check reference count
def use_module():
x = my_module.func()
print 'x =', x
print 'g(x) =', g(x)
print 'g(x[0]) =', g(x[0])
test = 'some random thing'
print 'should be', g(test), '?'
use_module()
>>> x = ( (1,2,3,4) , [2,3] , {'one':1} )
>>> g(x) = 3
>>> g(x[0]) = 3
>>> should be 2 ?
我希望 g(x)
是 2
,而不是 3
。 (在为 g
添加一个以参考 x
之后)
在我的 C++ 扩展中,我已经确保数组及其所有子集合及其元素在返回到 python 之前具有 1
的引用计数,所以我没有确定它是如何迅速飙升至 3
的?也许返回的 PyObject*
应该有 0
作为它的引用计数?
编辑:对不起,我是个白痴。我在不知情的情况下又做了一个参考[=23=]
如果不存在对返回对象的其他引用,则引用计数应为 1。如果引用计数为 0,则对象将被释放。