Допустим, вы написали расширение C++ (или C) для python, называемое module
. Он возвращает массив массивов. Что должен иметь возвращаемый массив и его массивы в качестве отсчетов ссылок?В расширениях C/C++ для Python, какой счетчик ссылок должен иметь возвращенный PyObject *?
код питона будет что-то вроде
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++ расширение, я убедился, что массив и все его подпункты коллекции и их элементы имеют опорные отсчеты 1
перед возвращением питона, поэтому я не уверен, как он выстрелил до 3
так быстро? Возможно, вернувшийся PyObject*
должен иметь 0
в качестве ссылочного счета?
Редактировать: извините, я идиот. Я делал еще одну ссылку, не зная об этом.
Чтобы быть более четким, https://docs.python.org/3/c-api/intro.html#reference-count-details указывает, когда должно произойти переполнение, i. е. он рассказывает о получении справки, заимствовании, краже и т. д. – glglgl