web-dev-qa-db-fra.com

Supprimer tous les objets d'une liste

Je crée beaucoup d'objets puis je les stocke dans une liste. Mais je veux les supprimer après un certain temps parce que je crée un journal et je ne veux pas que ma mémoire devienne haute (dans mon cas, il saute à 20 Go de RAM si je ne le supprime pas).

Voici un petit code pour illustrer ce que j'essaie de faire:

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 et B sont mes objets. C est une liste de ces deux objets. J'essaie de le supprimer définitivement avec une boucle for dans C: une fois avec DEL et une autre fois avec une fonction. Cela ne semble pas fonctionner car l'impression continue de montrer les objets.

J'ai besoin de cela parce que je crée 100 000 objets plusieurs fois. La première fois que je crée un objet de 100 000 $, la deuxième fois, une autre de 100 000 $ mais je n'ai pas besoin de conserver les 100 000 précédents. Si je ne les supprime pas, l’utilisation de la mémoire est très élevée, très rapidement.

30

tl; dr;

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

sont probablement les meilleurs moyens de le faire. Le reste de cette réponse tente d'expliquer pourquoi certains de vos autres efforts n'ont pas fonctionné.


cpython au moins travaille sur le comptage de références pour déterminer quand les objets seront supprimés. Ici, vous avez plusieurs références aux mêmes objets. a fait référence au même objet que c[0] les références. Lorsque vous passez en boucle sur c (for i in c:), à un moment donné i fait également référence à ce même objet. le mot clé del supprime une seule référence, ainsi:

for i in c:
   del i

crée une référence à un objet dans c puis supprime cette référence - mais l'objet possède toujours d'autres références (une stockée dans c par exemple), de sorte qu'il persistera.

De la même manière:

def kill(self):
    del self

supprime uniquement une référence à l'objet dans cette méthode. Une façon de supprimer toutes les références d'une liste consiste à utiliser l'affectation de tranche:

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

Apparemment, vous pouvez également supprimer la tranche pour supprimer des objets en place:

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

Cela supprimera toutes les références de mylist et supprimera également les références de tout ce qui fait référence à mylist. Comparé à simplement supprimer la liste - par exemple.

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, ...]

Enfin, les révisions python plus récentes) ont ajouté une méthode clear qui fait la même chose que del mylist[:] Est-ce que.

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

Voici comment vous supprimez chaque élément d'une liste.

del c[:]

Voici comment vous supprimez les deux premiers éléments d'une liste.

del c[:2]

Voici comment vous supprimez un seul élément d'une liste (a dans votre cas), en supposant que c est une liste.

del c[0]
29
Jon-Eric

Si l'objectif est de supprimer les objets a et b eux-mêmes (ce qui semble être le cas), il n'est pas utile de former la liste [a, b]. Au lieu de cela, il convient de conserver une liste de chaînes utilisées comme noms de ces objets. Celles-ci permettent de supprimer les objets d'une boucle en accédant au dictionnaire globals().

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

Pour supprimer tous les objets d'une liste, vous pouvez directement écrire list = []

Voici un exemple:

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