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
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)
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.
>>> 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.
>>> 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 aRef
aRef
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
- 1. Python, próxima iteración del ciclo sobre un ciclo
- 2. ¿Por qué continuar en un ciclo es una mala idea?
- 3. ¿Qué es un punto de referencia?
- 4. ¿Qué es el ciclo de eventos en el ciclo de vida ios y cuál es su uso y qué hace?
- 5. ¿Es posible crear un ciclo de referencia utilizando solo tipos de valores?
- 6. En Python, ¿cómo funciona un ciclo for con `rango`?
- 7. ¿Por qué goteo la memoria con este ciclo de python?
- 8. ¿Qué es un "método" en Python?
- 9. ¿Qué es 'Referencia global JNI'
- 10. ¿Por qué usar un ciclo "do while"?
- 11. ¿Qué es una referencia directa en C?
- 12. En expresiones regulares, ¿qué es un retroceso/referencia inversa?
- 13. En Perl, ¿es un ciclo while generalmente más rápido que un ciclo for?
- 14. ¿Qué es un equivalente Python de Perlbrew?
- 15. ¿Qué es un huevo de Python?
- 16. Qué es un subproceso de python
- 17. ¿Qué es un objeto de código Python?
- 18. ¿Cómo unir enlaces en Python para obtener un ciclo?
- 19. ¿Qué es una "referencia de marco débil"?
- 20. Si te importas en Python, ¿por qué no obtienes un ciclo infinito?
- 21. Condición Asignación en Python ciclo Mientras
- 22. Referencia del proyecto vs. Referencia DLL - ¿Qué es mejor?
- 23. Python - Valores anteriores y siguientes dentro de un ciclo
- 24. ¿Qué es 'imprimir' en Python?
- 25. auto referencia de jackson que conduce al ciclo
- 26. ¿Qué es "\ 00" en Python?
- 27. ¿Por qué no puedo hacer un ciclo en Javascript?
- 28. lista de Python no es la misma referencia
- 29. ¿Qué es útil sobre un parámetro referencia-a-matriz?
- 30. ¿Es posible acceder al índice en un Hash cada ciclo?