2016-06-02 8 views
0

Nehmen wir an, Sie haben eine C++ - (oder C-) Erweiterung für Python namens module geschrieben. Es gibt ein Array von Arrays zurück. Was sollten das zurückgegebene Array und seine Arrays als Referenzzähler haben?In C/C++ - Erweiterungen für Python, welche Referenzzahl sollte ein zurückgegebenes PyObject * haben?

Der Python-Code wäre so etwas wie

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 ? 

sein ich g(x) erwarten würde 2, nicht 3 sein.

In meinem C (nach dem Hinzufügen eines für gx zu referenzieren) ++ Erweiterung, ich habe dafür gesorgt, dass das Array und alle seine Untersammlungen und deren Elemente Referenzzähler von 1 bevor Python zurückgegeben werden, also bin ich nicht sicher, wie es so schnell auf 3 geschossen? Vielleicht zurückgegeben PyObject* sollte 0 als Referenz zählen?

Edit: Entschuldigung, ich bin ein Idiot. Ich machte eine weitere Referenz, ohne es zu wissen.

Antwort

0

Wenn keine anderen Verweise auf das zurückgegebene Objekt vorhanden sind, sollte refcount den Wert 1 haben. Wenn refcount den Wert 0 hat, wird das Objekt freigegeben.

+0

Um klarer zu sein, https://docs.python.org/3/c-api/intro.html#reference-count-details sagt genau, wann die Refcount-Sachen passieren müssen, d. e. es erzählt von Referenzempfangen, Ausleihen, Stehlen usw. – glglgl