[Python-de] Extension

Dietmar Schwertberger news at schwertberger.de
Mi Mär 28 00:58:40 CEST 2012


Am 27.03.2012 20:29, schrieb Bernd Nawothnig:
> Aber viel mehr würde mich interessieren, ob PyList_SetItem und
> PyList_Append automatisch den Referenzzähler der eingefügten, bzw.
> zugewiesenen Objekte erhöhen. Ich vermute es stark, und die Extension
> funktioniert auch problemlos, was aber ja keineswegs eine Garantie auf
> Korrektheit ist, weil der GC asynchron zuschlagen kann (und dann
> müssen die Referenzzähler korrekt gesetzt sein). Und deswegen wüsste
> ich es gerne explizit.
>
> Kann mir da einer was zu sagen?
Siehe http://docs.python.org/c-api/list.html.
PyList_SetItem stiehlt die Referenz, was hier aber OK ist, da
Py_BuildValue ein neue Referenz liefert und auch die Referenz auf das
ursprüngliche Objekt erhöht.
PyList_Append erhöht den Zähler, so daß du den Count auf den
Rückgabewert von VLP_asPyList selbst reduzieren musst. Aktuell
hast du also ein Speicherleck.

Wenn du zuerst eine Liste mit der richtigen Länge anlegst und dann
alles mit PyList_SetItem füllst, wirds auch noch ein bischen schneller.


Der Grund für das abweichende Verhalten von PyList_SetItem steht hier:
  http://docs.python.org/c-api/intro.html#objects-types-and-reference-counts
Few functions steal references; the two notable exceptions are 
PyList_SetItem() and PyTuple_SetItem(), which steal a reference to the 
item (but not to the tuple or list into which the item is put!). These 
functions were designed to steal a reference because of a common idiom 
for populating a tuple or list with newly created objects; for example, 
the code to create the tuple (1, 2, "three") could look like this 
(forgetting about error handling for the moment; a better way to code 
this is shown below):


Gruß,

Dietmar


Mehr Informationen über die Mailingliste python-de