Eliminar todos los objetos en una lista

Creo muchos objetos y luego los almaceno en una lista. Pero quiero eliminarlos después de un tiempo porque creo una noticia y no quiero que mi memoria se agote (en mi caso, salta a 20 gigas de RAM si no la borro).

Aquí hay un pequeño código para ilustrar lo que estoy tratando de hacer:

class test: def __init__(self): self.a = "Hello World" def kill(self): del self a = test() b = test() c = [a,b] print("1)Before:",a,b) for i in c: del i for i in c: i.kill() print("2)After:",a,b) 

A y B son mis objetos. C es una lista de estos dos objetos. Estoy intentando borrarlo definitivamente con un bucle for en C: una vez con DEL y otra vez con una función. Parece que no funciona porque la impresión sigue mostrando los objetos.

Necesito esto porque creo 100 000 objetos muchas veces. La primera vez que creo un objeto de 100k, la segunda vez que otro 100k, no necesito mantener los 100k anteriores. Si no los borro, el uso de la memoria va muy alto, muy rápidamente.

tl; dr;

 mylist.clear() # Added in python3.(? maybe 5?) del mylist[:] 

Son probablemente las mejores formas de hacer esto. El rest de esta respuesta trata de explicar por qué algunos de sus otros esfuerzos no funcionaron.


cpython al menos funciona en el conteo de referencias para determinar cuándo se eliminarán los objetos. Aquí tienes múltiples referencias a los mismos objetos. a refiere al mismo objeto al que c[0] referencia. Cuando pasas sobre c ( for i in c: , en algún punto i también se refiere a ese mismo objeto. la palabra clave del dele elimina una sola referencia, por lo que

 for i in c: del i 

crea una referencia a un objeto en c luego borra esa referencia, pero el objeto todavía tiene otras referencias (una almacenada en c por ejemplo), por lo que persistirá.

Del mismo modo:

 def kill(self): del self 

solo borra una referencia al objeto en ese método. Una forma de eliminar todas las referencias de una lista es usar la asignación de segmentos:

 mylist = list(range(10000)) mylist[:] = [] print(mylist) 

Al parecer, también puede eliminar la división para eliminar objetos en su lugar:

 del mylist[:] #This will implicitly call the `__delslice__` or `__delitem__` method. 

Esto eliminará todas las referencias de mylist y también eliminará todas las referencias que se refieran a mylist . Comparado con simplemente eliminar la lista, por ejemplo,

 mylist = list(range(10000)) b = mylist del mylist #here we didn't get all the references to the objects we created ... print(b) #[0, 1, 2, 3, 4, ...] 

Finalmente, las revisiones más recientes de python han agregado un método clear que hace lo mismo que hace del mylist[:] .

 mylist = [1, 2, 3] mylist.clear() print(mylist) 

Así es como se eliminan todos los elementos de una lista.

 del c[:] 

Aquí se explica cómo eliminar los dos primeros elementos de una lista.

 del c[:2] 

A continuación se explica cómo eliminar un solo elemento de una lista ( a en su caso), asumiendo que c es una lista.

 del c[0] 

Para eliminar todos los objetos en una lista, puede escribir directamente la list = []

Aquí está el ejemplo:

 >>> a = [1, 2, 3] >>> a [1, 2, 3] >>> a = [] >>> a [] 

Si el objective es eliminar los objetos a y b (lo que parece ser el caso), formar la lista [a, b] no es útil. En su lugar, uno debe mantener una lista de cadenas utilizadas como los nombres de esos objetos. Esto permite que uno elimine los objetos en un bucle, accediendo al diccionario globals() .

 c = ['a', 'b'] # create and work with a and b for i in c: del globals()[i]