2009-04-17 14 views

Respuesta

6

Desde el getrefcount docstring:

... 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().

Las otras dos referencias significan que python posee internamente dos referencias al objeto. Tal vez los diccionarios locales() y globals() cuentan como una referencia cada uno.

+0

gracias por una solución adecuada – user46646

+0

así que cuando hago un "del astrd", su recuento de referencia se convierte en 0 y es recogido por gc? – user46646

6

creo que cuenta las referencias a 123, probar otros ejemplos, como

>>> import sys 
>>> astrd = 1 
>>> sys.getrefcount(astrd) 
177 
>>> astrd = 9802374987193847 
>>> sys.getrefcount(astrd) 
2 
>>> 

El refcount para 9802374987193847 se ajusta la respuesta de codeape.

Esto es probablemente porque los números son inmutables. Si, por ejemplo, utiliza una lista, siempre será 2 (desde un mensaje limpio que es).

Por cierto, obtengo 2 para 123 también, tal vez su configuración es algo diferente? ¿O podría estar relacionado con el tiempo o más o menos?

+0

gracias por una solución adecuada – user46646

5

enteros son implementados de una manera especial, que se almacenan en caché y se comparten, eso por lo que no recibe 1.

y Python, utiliza objetos de referencia contado. astrd es en sí mismo una referencia, por lo que realmente obtienes el número de referencias al int '123'. Pruebe con otro tipo (definido por el usuario) y obtendrá 1.

+0

gracias por una solución adecuada – user46646

7

No es astrd que se referencia tres veces, pero el valor 123. astrd es simplemente un nombre para el número (inmutable) 123, que se puede hacer referencia tantas veces. Además de eso, los pequeños números enteros son generalmente compartidos:

>>> astrd = 123 
>>> sys.getrefcount(astrd) 
4 
>>> j = 123 
>>> sys.getrefcount(astrd) 
5 

En la segunda asignación, se crea ningún nuevo número entero, en lugar j es sólo un nuevo nombre para el número entero 123.

Sin embargo, dado números enteros muy grandes, esto no se sostiene:

>>> i = 823423442583 
>>> sys.getrefcount(i) 
2 
>>> j = 823423442583 
>>> sys.getrefcount(i) 
2 

enteros compartidos son un detalle de implementación de CPython (entre otros). Como los enteros pequeños se crean instancias muy a menudo, compartirlos ahorra mucha memoria. Esto es posible por el hecho de que los enteros son inmutables en primer lugar.

Para la referencia adicional en el segundo ejemplo, cf. codeape's answer.

+0

gracias por una solución adecuada – user46646

Cuestiones relacionadas