Py_INCREF / DECREF: Cuando

Es una correcta en afirmar lo siguiente:

EDITAR: -> ¿Puedo usar esto de manera segura en cada situación? (No me he topado con uno donde me causó problemas)

  • Dealloc de un objeto Python necesita DECREF para todos los demás objetos Python que tiene como atributo, pero no para los atributos que son de tipo C

Editar

Con ‘tipo C como atributo’ me refiero a bar y baz:

 typedef struct { PyObject_HEAD PyObject *foo; int bar; double baz; } FooBarBaz; 

Primero, lea esto con más cuidado, específicamente el último párrafo, http://docs.python.org/extending/extending.html#ownership-rules

Una forma fácil de pensar es pensar en los recuentos de referencia.

  1. Su primera statement es correcta. Si crea un nuevo objeto Python (por ejemplo, PyLong ), entonces ya tiene un número de referencia de 1. Esto está bien si lo va a devolver, pero si no lo va a devolver, debe ser recolectado por la basura. Python y solo está marcado para GC con refcount = 0, por lo tanto, debe DECRETARSE si no lo va a devolver.

  2. La segunda afirmación es falsa. Si necesita devolverlo y lo ha creado, simplemente devuélvalo. Devolución de transferencias de titularidad. Si INCREFÍAS antes de regresar, entonces le estás diciendo a Python que también estás reteniendo una copia. Así que de nuevo, si lo creas, refcount = 1. Si luego haces INCREF entonces refcount = 2. Pero esto no es lo que quiere, quiere regresar con refcount = 1.

  3. No estoy seguro de haberlo entendido, pero se trata más bien de una pregunta relacionada con C. ¿Cómo estás agregando un int o un double a un objeto de Python?

  4. ¿Puedes dar un ejemplo donde ese método no funcione?

  5. De nuevo, no estoy seguro de cuándo un tipo C es un atributo de un objeto de Python. Cada int , double , long , etc. está envuelto por un objeto Python de alguna manera u otra.

Las advertencias a estas respuestas se describen en el enlace de arriba. Realmente no deberías necesitar mi pobre explicación después de leer eso. Espero haberlo aclarado y no confundir más.