Este es un intento de comprender mejor cómo funciona el recuento de referencias en Python.Descripción del recuento de referencias de la variable de clase
Creemos una clase y creemos una instancia. contador de referencia del ejemplo sería 1
(getrefcount
pantallas 2
porque las propias estructuras internas hacen referencia a esa instancia de la clase aumentar el conteo de referencia por 1
):
>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000
>>> a = A()
>>> grc(a)
2
a
's internos variables x
tiene 2
referencias:
>>> grc(a.x)
3
Esperaba que fuera referenciado por a
y por el método A
__init__
. Entonces decidí verificar.
Así que creé una variable temporal b
en el espacio de nombres __main__
solo para poder acceder a la variable x
. Aumentó el número de ref por 1
para que se convierta 3
(como se esperaba):
>>> b = a.x
>>> grc(a.x)
4
Entonces suprime la instancia de clase y el recuento ref disminuido en 1
:
>>> del a
>>> grc(b)
3
Así que ahora hay 2
referencias: una es por b
y la otra es por A
(como esperaba).
Al eliminar A
desde __main__
espacio de nombres Espero que el conteo disminuya en 1
nuevamente.
>>> del A
>>> grc(b)
3
Pero no sucede. No existe ninguna clase A
o sus instancias que puedan hacer referencia a 100000
, pero aún así se hace referencia a ella en el espacio de nombres .
Entonces, mi pregunta es, ¿a qué se refiere 100000
aparte de b
?
BrenBarn sugirió que debería utilizar object()
lugar de un número que puede ser almacenado en algún lugar internamente.
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
Después de eliminar la instancia a
hubiera una sola referencia por b
que es muy lógico.
Lo único que queda por entender es por qué no es así con el número 100000
.
Supongo que, 'A .__ dict__'? –
@JakobBowyer Pero cuando elimino 'A', entonces' A .__ dict__' debería ser basura recolectada porque no está referenciada por nada (según tengo entendido). – ovgolovin
Ver esta respuesta: http://stackoverflow.com/questions/759740/unexpected-result-from-sys-getrefcount –