2016-06-02 3 views
0

Допустим, вы написали расширение 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 в качестве ссылочного счета?

Редактировать: извините, я идиот. Я делал еще одну ссылку, не зная об этом.

ответ

0

Если никаких других ссылок на возвращаемый объект не существует, refcount должен быть равен 1. Если refcount равен 0, объект будет освобожден.

+0

Чтобы быть более четким, https://docs.python.org/3/c-api/intro.html#reference-count-details указывает, когда должно произойти переполнение, i. е. он рассказывает о получении справки, заимствовании, краже и т. д. – glglgl