2016-06-02 4 views
0

당신은 module라고하는 Python에 C++ (또는 C) 확장자를 썼다고합시다. 배열 배열을 반환합니다. 리턴 된 배열과 그 배열은 참조 카운트로서 무엇을 가져야 하는가?파이썬에 대한 C/C++ 확장 기능에서, 반환 된 PyObject *는 어떤 참조 카운트를 가져야합니까?

파이썬 코드는 내가 g(x)2하지 3 것으로 기대

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 ? 

같은 것입니다. 내 C에서

을 (g 하나를 추가 한 후 x를 참조) ++ 확장, 나는 확실히 만든 그 배열과 모든 하위 컬렉션과 그 요소는 파이썬에 반환되기 전에 1의 참조 카운트를, 그래서 난 어떻게 그렇게 빨리 총 3까지 총 확실하지? 아마도 PyObject*의 참조 횟수는 0이어야합니다.

편집 : 죄송합니다, 저는 바보입니다. 나는 그것을 모른 채 다른 참조를 만들고 있었다.

답변

0

반환되는 객체에 대한 다른 참조가없는 경우 refcount는 1이어야합니다. refcount가 0이면 객체의 할당이 해제됩니다.

+0

더 명확히 말하면 https://docs.python.org/3/c-api/intro.html#reference-count-details는 refcount 작업이 언제 발생해야하는지 정확하게 알려줍니다. 이자형. 참조 수신, 차용, 도난 등에 관한 정보 – glglgl