1.10.1 Saldo de referencias en Python

Hay dos macros, Py_INCREF(x) y Py_DECREF(x), que gestionan el incremento y decremento del saldo de referencias. Py_DECREF() también libera el objeto cuando el saldo llega a cero. Para ser más flexible, no llama a free() directamente, sino que realiza una llamada mediante un puntero a función del tipo de objeto del objeto. Por esto y otros motivos, cada objeto también contiene un puntero a su tipo de objeto.

Queda la gran cuestión: cuándo usar Py_INCREF(x) y Py_DECREF(x). Vamos a presentar algunos términos. Nadie ``posee'' un objeto, pero puede poseer una referencia al objeto. El saldo de referencias del objeto se define ahora como el número de referencias a él que tengan dueño. El dueño de una referencia tiene la responsabilidad de llamara a Py_DECREF() cuando no se necesite más la referencia. La propiedad de una referencia es transferible. Hay tres modos de deshacerse de una referencia propia: Transferirla, almacenarla o llamar a Py_DECREF(). Si se olvida deshacerse de una referencia propia se causará una pérdida de memoria.

También es posible tomar prestada1.3 una referencia al objeto. El que toma prestada la referencia no debe utilizar el objeto más tiempo que su dueño. Si se usa una referencia prestada después de que el dueño se haya deshecho de ella, hay un riesgo de que se utilice memoria liberada que se debe evitar por completo1.4.

La ventaja de tomar prestada una referencia en lugar de poseerla estriba en que no hay que ocuparse de deshacerse de la referencia en todo recorrido posible del código. Dicho con otras palabras, con una referencia prestada no hay peligro de pérdidas en el caso de salidas prematuras. La desventaja es que hay situaciones muy sutiles en que código aparentemente correcto utiliza una referencia prestada cuando su dueño ya se había deshecho de ella.

Se puede tomar posesión de una referencia prestada llamando a Py_INCREF(). Esto no afecta al estado del dueño original de la referencia, sólo crea una nueva propiedad de la referencia y carga al nuevo propietario con las mismas responsabilidades de dueño (es decir, el nuevo propietario debe deshacerse de la referencia correctamente, como también debe el antiguo propietario).



Notas al pie

... prestada1.3
La metáfora de ``tomar prestada'' una referencia no es completamente fiel: el dueño mantiene una copia de la referencia.
... completo1.4
Comprobar que el saldo de referencia es positivo no funciona el propio contador puede estar en memoria liberada y reasignada, por lo que puede pertenecer a otro objeto.

Ver Sobre este documento... para obtener información sobre sugerencias.