python - listas - Eliminar todos los objetos en una lista
eliminar elementos de una lista python (4)
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 pero no necesito mantener los 100k anteriores. Si no los borro, el uso de la memoria va muy alto, muy rápidamente.
Así es como se eliminan todos los elementos de una lista.
del c[:]
Así es como se eliminan los dos primeros elementos de una lista.
del c[:2]
Aquí 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 objetivo 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]
tl; dr;
mylist.clear() # Added in python3.(? maybe 5?)
del mylist[:]
Son probablemente las mejores formas de hacer esto. El resto de esta respuesta trata de explicar por qué algunos de sus otros esfuerzos no funcionaron.
al menos cpython 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)