Tengo una situación en la que me gustaría mantener una asignación de un objeto a otro durante el tiempo que exista el primer objeto. Mi primer pensamiento fue usar un WeakKeyDictionary.GC ¿No elimina las referencias circulares en WeakKeyDictionaries?
import weakref
import gc
class M:
pass
w = weakref.WeakKeyDictionary()
m = M()
w[m] = some_other_object
del m
gc.collect()
print w.keys()
Esto funciona bien en la mayoría de los casos. Sin embargo, en el caso en que some_other_object
es (o tiene una referencia) m
, la instancia M
no será basura. (Para ver un ejemplo, reemplazar some_other_object
con m
)
Por supuesto, si Almacené mapas en el objeto en sí mismo, sería el recolector de basura cuando lo he borrado:
import weakref
import gc
class M:
pass
m = M()
m.circular_reference = m
r = weakref.ref(m)
del m
gc.collect()
print r
¿Puedo conseguir los resultados del segundo ejemplo que usa el módulo weakref (es decir, sin mutar m
)?
En otras palabras, ¿puedo usar el módulo weakref para asignar un objeto a sí mismo (u otro objeto que tenga una referencia fuerte) y solo mantener el objeto en memoria mientras haya otras referencias al mismo?
¿Podría explicar la frase "a través de un mecanismo separado que no implica una referencia fuerte"? ¿Qué es este mecanismo y por qué dices que no es una referencia fuerte? Estoy de acuerdo con su conclusión (¡aunque insatisfactoria!), Y estoy dispuesto a aceptar su respuesta, pero me gustaría aclarar este punto. – matthewwithanm
El dict contiene una fuerte referencia al valor. Si se recopila la clave, se notifica al dict y se libera su referencia al valor. Entonces, esto se comporta de alguna manera como si la clave tuviera una referencia al valor (que completaría un círculo de referencia), pero en realidad no hay referencia directa. En cambio, el dict se ubica entre la clave y el valor para producir un resultado similar sin una referencia de clave-> valor. ¿Eso ayuda? Me temo que mi explicación es un poco circular (y el juego de palabras está completo ahora que la publicación se refiere a sí misma). – Luke