2012-04-24 17 views
12

Según entiendo, sys.getrefcount() devuelve el número de referencias de un objeto, que "debería" ser de 1 en el caso siguiente:¿Por qué sys.getrefcount() devuelve 2?

import sys,numpy 
a = numpy.array([1.2,3.4]) 
print sys.getrefcount(a) 

Sin embargo, resultó ser 2! Por lo tanto, si yo:

del a 

¿El "numpy.array ([1.2,3.4])" objeto todavía estará allí (sin recolección de basura)?

+1

Puede construir una demostración más simple: x = 1.1; print sys.getrefcount (x) –

Respuesta

20

Cuando llama al getrefcount(), la referencia se copia por valor en el argumento de la función, aumentando temporalmente el recuento de referencias del objeto. De aquí viene la segunda referencia.

Esto se explica en el documentation:

El número devuelto es generalmente uno más alto que se podría esperar, , ya que incluye la referencia (temporal) como un argumento a getrefcount().

En cuanto a su segunda pregunta:

Si "del a", la "numpy.array ([1. 2,3.4]) "¿el objeto aún está allí (sin recolección de basura)?

Por las salidas de tiempo getrefcount(), contador de referencia del array para respaldar a 1, y una posterior del a sería liberar la memoria.

+0

Si fuera "copiado por valor" no habría una segunda referencia. Python pasa los argumentos por referencia y nunca copia los valores a menos que se le pregunte explícitamente. – bukzor

+0

@bukzor: si lee la respuesta detenidamente, verá que las palabras "por valor" se aplican a la palabra "referencia", que ha omitido convenientemente de su presupuesto. Parece claro que has entendido mal lo que estaba tratando de decir. Desafortunadamente, no veo cómo reformular la respuesta para mejorar la claridad y precisión; si tiene alguna sugerencia específica, hágamelo saber. – NPE

+2

Cuando llama a getrefcount(), las variables locales de esa función hacen referencia al argumento dado, aumentando temporalmente el recuento de referencias del objeto. – bukzor

Cuestiones relacionadas