Différentes manières de supprimer des listes


159

Y a-t-il une raison de faire quelque chose de plus compliqué que l'une de ces deux lignes quand vous voulez effacer une liste en Python?

old_list = [] 
old_list = list() 

La raison pour laquelle je demande est que je viens de voir cela dans un code de fonctionnement:

del old_list[ 0:len(old_list) ] 
+1

Pourquoi faites-vous cela? La collecte des ordures fonctionne. Pourquoi ne pas simplement ignorer l'ancienne valeur de la liste et laisser Python la nettoyer automatiquement? 12 mai. 092009-05-12 02:15:37

+32

@ S.Lott: L'affiche n'a pas écrit le code, et demande pourquoi l'auteur original peut l'avoir fait. 12 mai. 092009-05-12 03:20:59

+14

Sans rapport avec votre question, mais vous ne devez pas utiliser len lorsque vous spécifiez une tranche. 'a [: x]' signifie commencer par x et 'a [x:]' signifie x pour finir. 'a [0: len (a)]' peut être écrit comme 'a [:]'. Vous pouvez également utiliser des négatifs pour compter à partir de la fin ('a [-1]' est le dernier élément). 23 févr.. 112011-02-23 20:53:51

+1

Vous pouvez également faire: tandis que l: l.pop() 13 mai. 092009-05-13 02:10:35

+9

LOL. Je suis sûr que c'est efficace. 13 mai. 092009-05-13 02:17:07

+1

Personne n'a dit quoi que ce soit sur son efficacité ... 13 mai. 092009-05-13 03:11:52

303

Effacement d'une liste en place aura une incidence sur toutes les autres références de la même liste.

Par exemple, cette méthode ne modifie pas d'autres références:

>>> a = [1, 2, 3] 
>>> b = a 
>>> a = [] 
>>> print(a) 
[] 
>>> print(b) 
[1, 2, 3] 

Mais celui-ci fait:

>>> a = [1, 2, 3] 
>>> b = a 
>>> del a[:]  # equivalent to del a[0:len(a)] 
>>> print(a) 
[] 
>>> print(b) 
[] 
>>> a is b 
True 

Vous pouvez également faire:

>>> a[:] = [] 
+6

Hmm, vous apprenez quelque chose de nouveau tous les jours. 12 mai. 092009-05-12 02:05:32

+80

Vous pouvez aussi faire 'del a [:]' 23 févr.. 112011-02-23 20:51:16

+1

Pourquoi le premier n'affectera que 'a'? J'ai pensé que 'a' et' b' faisaient référence au même objet ... Je veux juste savoir pourquoi. Merci. 22 nov.. 142014-11-22 09:48:11

+20

Avec ** python 3.3 ** et plus tard vous pouvez aller avec 'a.clear()', pas de problème! 06 déc.. 142014-12-06 16:20:51

+4

@Stallman parce que vous changez d'abord une référence pour 'a' pour pointer vers un nouveau tableau, n'en effacez pas un, et b pointe toujours sur un ancien 04 févr.. 152015-02-04 14:36:34

+4

Ce serait génial si quelqu'un pouvait montrer la différence de performance entre ces méthodes! 24 juil.. 152015-07-24 20:40:29


11

Il apparaît à moi que del vous donnera la mémoire, tandis que l'attribution d'une nouvelle liste fera l'ancien être supprimé uniquement lorsque le gc runs.matter.

Ceci peut être utile pour les grandes listes, mais pour les petites listes, il devrait être négligeable.

Modifier: Comme Algorias, ce n'est pas grave.

Notez que

del old_list[ 0:len(old_list) ] 

est équivalent à

del old_list[:] 
+2

gc n'est pas exécuté en cycles. La liste est libérée dès que sa dernière référence est supprimée. 12 mai. 092009-05-12 04:45:55

+2

Algorias: c'est vrai pour CPython, mais peut-être pas pour d'autres implémentations. 18 déc.. 112011-12-18 23:48:20

+1

del old_list [0: len (old_list)] et del old_list [:] ont le même résultat, mais le dernier est plus rapide (vérifié dans Python 2.6) 12 févr.. 132013-02-12 14:38:10


4

Il y a deux cas dans lesquels vous pourriez vouloir effacer une liste:

  1. Vous voulez utiliser le nom old_list plus loin dans votre code;
  2. Vous souhaitez que l'ancienne liste soit collectée dans les plus brefs délais pour libérer de la mémoire;

Dans le cas 1 vous allez juste avec le assigment:

old_list = [] # or whatever you want it to be equal to 

Dans le cas 2 la déclaration del réduirait le nombre de références à la liste objet le nom old list points. Si l'objet liste n'est pointé que par le nom old_list at, le nombre de références sera 0 et l'objet sera libéré pour la récupération de place.

del old_list 

30

Il existe un moyen très simple de supprimer une liste python. Utilisez del list_name [:].

Par exemple:

>>> a = [1, 2, 3]` 
>>> b = a 
>>> del a[:] 
>>> print a, b 
[] [] 

3
del list[:] 

supprimera les valeurs de cette liste de variables

del list 

supprimera la variable elle-même de la mémoire


1

Si vous effacer la liste , vous, évidemment, n'avez plus besoin de la liste. Si c'est le cas, vous pouvez simplement supprimer la liste entière par une simple méthode del.

a = [1, 3, 5, 6] 
del a # This will entirely delete a(the list). 

Mais dans le cas, vous avez besoin de nouveau, vous pouvez le réinitialiser. Ou tout simplement effacer ses éléments par

del a[:] 

-1

une autre solution qui fonctionne bien est de créer une liste vide comme une liste vide de référence. Par exemple, vous avez une liste de a_list = [1,2,3]. Pour effacer juste faire ce qui suit:

a_list = list(empt_list) 

cela fera a_list une liste vide comme le empt_list.


2

Pour effacer une liste en place en Python 3.3+, vous pouvez également utiliser list.clear(), qui est compatible avec les interfaces des autres conteneurs mutables (tels que dict, set ou deque).

old_list.clear() # removes all items from old_list (same as del old_list[:])