propias - parametros por referencia python
¿Qué es un ciclo de referencia en python? (4)
He buscado en la documentación oficial de python, pero parece que no puedo encontrar lo que es un ciclo de referencia. ¿Podría alguien aclarar qué es para mí, ya que estoy tratando de entender el módulo GC? Gracias de antemano por sus respuestas.
Este es un ciclo de referencia:
l = []
l.append(l)
El primer elemento de l
, es decir, l[0]
, es ahora una referencia cíclica a l
sí.
Un ciclo de referencia simplemente significa uno o más objetos que hacen referencia entre sí, de manera que si lo dibujara en un papel con flechas que representan las dependencias, vería un ciclo.
El ciclo de referencia (casi) más simple es tener dos objetos a
y b
que se refieren entre sí:
a.other = b
b.some_attr = a
Los recolectores de basura ingenuos trabajan estrictamente para saber si un objeto es referenciado por otro objeto o no. En este caso, si a
y b
no son referidos por otra cosa, todavía se refieren entre sí y un recolector de basura ingenuo no puede reclamar la memoria. (No sé si Python puede ser atrapado por ciclos de referencia o no).
EDITAR: El ciclo de referencia más simple es un objeto que se refiere a sí mismo:
a = []
a.append(a)
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]
Esto crea un objeto de lista referido por una variable llamada aRef
. El first element
en el objeto de lista es una referencia a sí mismo. En este caso, la del aRef
aRef
para el objeto de lista. Sin embargo, el recuento de referencia del objeto de lista no se reduce a cero y el objeto de lista no se recolecta como basura, ya que el objeto de lista todavía se refiere a sí mismo. En este caso, el recolector de basura en Python verificará periódicamente si existen tales referencias circulares y el intérprete las recogerá. El siguiente es un ejemplo para recopilar manualmente el espacio utilizado por los objetos de referencia circular.
>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>>
Ahora aquí la variable x
se refiere a sí misma, esto se llama ciclo de referencia.