Hay varios subprocesos en la recolección de basura de Python en SO, y después de leer aproximadamente cinco, más algunos documentos en línea, todavía no estoy seguro de cómo funciona la recolección de basura y cómo debo administrar los objetos que no estoy usando. De hecho, en algún lugar que he leído, uno no debe hacer nada para recolectar basura, otros dicen que uno debe tener objetos del
, mientras que otros explican que la eliminación de referencias de un objeto es suficiente para que Python lo recoja como basura.¿Cómo asignar objetos a la recolección de basura de python?
Por lo tanto, a riesgo de crear un duplicado, haré la pregunta nuevamente, pero de manera diferente, con la esperanza de obtener información más completa y clara.
En mi caso, quiero hacer una pequeña simulación con objetos que representen personas. Se crearán varias instancias de la clase Person()
. Debería existir durante un tiempo hasta que prácticamente "muera" mientras se crearán otras instancias.
Ahora, ¿cómo puedo hacer que esta instancia Person()
"muera" (suponiendo que muchas de estas instancias se crearán y no quiero que estas instancias cuelguen como fantasmas)?
Hay varias maneras que pueden hacer referencia a un objeto:
john = Person('john')
o
people = []
people.append(Person('john'))
o
people = {}
people['john'] = Person('john')
¿Cuál es la mejor manera de mantener mi programa de limpieza, liberación de recursos ¿óptimo? ¿Y cuál es la mejor manera de hacer referencia a mi objeto para poder controlar la eliminación del objeto?
Compruebe el módulo gc: http://docs.python.org/library/gc.html – rubik
La respuesta corta es: usted no. Se lo lleva solo cuando no usas (tienes una referencia) más. O tal vez más tarde o nunca. GC no es determinista, la única garantía es que no se quedará sin memoria si hay basura para reutilizar (excepto en algunas circunstancias con GC conservadores, pero ni Python ni en ningún otro lenguaje administrado por memoria tiene que usar estos; los lenguajes con aritmética de puntero o una manera para que los punteros escapen como enteros, etc.). Y a menos que lo comprenda y por qué no necesita preocuparse en absoluto, debe dejarlo así. – delnan
Esta pregunta podría aplicarse igualmente a ruby, Smalltalk, Java, C# o VB6 y quizás a muchos otros. – quamrana