16

He buscado en la documentación oficial de Python, pero no puedo encontrar lo que es un ciclo de referencia. ¿Alguien podría aclarar lo que es para mí, ya que estoy tratando de entender el módulo de GC. Gracias de antemano por sus respuestas.¿Qué es un ciclo de referencia en python?

Respuesta

15

Un ciclo de referencia simplemente significa uno o más objetos que se referencian entre sí, de forma que si lo dibujó en un papel con flechas que representan las dependencias vería un ciclo.

El (casi) ciclo de referencia más sencilla es tener dos objetos a y b que hacen referencia el uno al otro:

a.other = b 
b.some_attr = a 

colectores de basura Naive trabajan estrictamente fuera de si o no un objeto es referenciado por otro objeto. En este caso, si ninguno de los dos hace referencia a a y b, aún se refieren el uno al otro y un recolector de basura ingenuo no puede reclamar la memoria. (No sé si Python puede quedar atrapado por ciclos de referencia o no, sin embargo.)

EDIT: El ciclo de referencia más simple es un objeto que se refiere a sí mismo:

a = [] 
a.append(a) 
10

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í mismo.

3
>>> 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.

7
>>> aRef = [] 
>>> aRef.append(aRef) 
>>> print aRef 
[[...]] 

Esto crea un objeto de lista mencionada por una variable llamada aRef. el first element en el objeto list es una referencia a sí mismo. En este caso, la desreferencia del aRefaRef al objeto list. Sin embargo, el recuento de referencia del objeto de la lista no disminuye a cero y el objeto de la lista no es basura, ya que el objeto de la 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á. A continuación se muestra 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 
Cuestiones relacionadas