Escribo un juego de plataforma simple, y he encontrado que al eliminar instancias 'fantasmas', persisten y no son basura. Parece que, aunque elimino todas las referencias, los objetos fantasma tienen algún tipo de referencias internas que impiden que sean recolectadas. Específicamente, tienen atributos que son conmutadores de método.referencia interna impide la recolección de basura
El siguiente código ilustra mi problema:
import weakref
weak_ghosts = weakref.WeakKeyDictionary()
class Ghost(object):
def __init__(self):
#pass
self.switch = {'eat':self.eat, 'sleep':self.sleep}
def eat(self):
pass
def sleep(self):
pass
ghost = Ghost()
weak_ghosts[ghost] = None
#ghost.switch = {} # uncomment this line and ghost is successfully removed
del ghost
print "number of ghosts =", len(weak_ghosts)
#output:
number of ghosts = 1
Preguntas:
- Lo que realmente está pasando?
- ¿Qué debo hacer para evitar esta situación?
- ¿Estoy utilizando la metodología correcta para crear un diccionario de métodos intercambiables?
Pero recuerde pasar el objeto explícitamente cuando realmente los llame –