Différentes façons d'effacer les listes

208

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

old_list = []
old_list = list()

La raison pour laquelle je demande, c'est que je viens de voir cela dans un code en cours d'exécution:

del old_list[ 0:len(old_list) ]
johannix
la source
1
Pourquoi fais-tu ça? La collecte des ordures fonctionne. Pourquoi ne pas simplement ignorer l'ancienne valeur de liste et laisser Python la nettoyer automatiquement?
S.Lott
40
@ S.Lott: L'affiche n'a pas écrit le code et demande pourquoi l'auteur original a pu le faire.
John Fouhy
1
Vous pouvez également faire: while l: l.pop ()
RoadieRich
12
LOL. Je suis sûr que c'est efficace.
FogleBird
18
Pas lié à votre question, mais vous ne devez pas utiliser len lorsque vous spécifiez une tranche. a[:x]signifie commencer à x et a[x:]signifie x à terminer. a[ 0:len(a) ]peut s'écrire a[:]. Vous pouvez également utiliser des négatifs pour compter à partir de la fin ( a[-1]est le dernier élément).
idbrii

Réponses:

358

La suppression d'une liste en place affectera toutes les autres références de la même liste.

Par exemple, cette méthode n'affecte pas les 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 pourriez également faire:

>>> a[:] = []
Koba
la source
87
Vous pourriez aussi fairedel a[:]
idbrii
1
Pourquoi le premier n'affectera que a? J'ai pensé aet fait bréférence au même objet ... Je veux juste savoir pourquoi. Merci.
Alston
38
Avec python 3.3 et versions ultérieures, vous pouvez y aller a.clear(), pas de problème!
Marek Lewandowski
4
@Stallman parce qu'au début, vous changez une référence pour 'a' pour pointer vers un nouveau tableau, pas pour en effacer un, et b pointe toujours un ancien
Pax0r
4
Ce serait génial si quelqu'un pouvait montrer la différence de performances entre ces méthodes!
Suanmeiguo
37

Faire alist = []ne supprime pas la liste, crée simplement une liste vide et la lie à la variable alist. L'ancienne liste existera toujours si elle avait d'autres liaisons de variables.

Pour effacer une liste sur place , vous pouvez utiliser l'une des méthodes suivantes:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

Voir la page de documentation sur les types de séquences mutables pour plus de détails.

Eugene Yarmash
la source
2
J'ai testé et alist * = 0 est le plus rapide, ensuite le plus rapide est alist.clear () et les deux autres méthodes sont tout aussi rapides. Pourriez-vous expliquer pourquoi alist * = 0 est le plus rapide?
Jenny
3
@Jenny: Il utilise simplement moins d' opcodes (ou moins chers) sous le capot. Par exemple, la version de l'opérateur n'a pas besoin de rechercher des noms de méthode ou des tranches de génération.
Eugene Yarmash
"Il devrait y avoir une - et de préférence une seule - manière évidente de le faire." Python brille ici :)
Nik O'Lai
36

Il existe un moyen très simple d'effacer une liste python. Utilisez del list_name [:] .

Par exemple:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
NixMan
la source
13

Il me semble que del vous rendra la mémoire, tandis que l'attribution d'une nouvelle liste ne supprimera l'ancienne que lorsque le gc fonctionnera.

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

Edit : En tant qu'Algorias, cela n'a pas d'importance.

Notez que

del old_list[ 0:len(old_list) ]

est équivalent à

del old_list[:]
besen
la source
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.
Algorias
2
Algorias: c'est vrai pour CPython, mais peut-être pas pour d'autres implémentations.
mhsmith
2
del old_list [0: len (old_list)] et del old_list [:] ont le même résultat, mais celui-ci est plus rapide (vérifié en Python 2.6)
Roy Nieterau
6
del list[:] 

Supprime les valeurs de cette variable de liste

del list

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

ytpillai
la source
5

Il existe deux cas dans lesquels vous souhaiterez peut-être effacer une liste:

  1. Vous souhaitez utiliser le nom old_listplus loin dans votre code;
  2. Vous souhaitez que l'ancienne liste soit récupérée le plus tôt possible pour libérer de la mémoire;

Dans le cas 1, vous continuez avec l'assignation:

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

Dans le cas 2, l' delinstruction réduirait le nombre de références à l'objet de liste vers lequel le nom old listpointe. Si l'objet de liste n'est pointé que par le nom old_listde, le nombre de références serait 0 et l'objet serait libéré pour la récupération de place.

    del old_list
Alex
la source
3

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

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

Mais au cas où vous en auriez besoin à nouveau, vous pouvez le réinitialiser. Ou tout simplement effacer ses éléments en

del a[:]
lavee_singh
la source
-4

une autre solution qui fonctionne bien est de créer une liste vide en tant que liste vide de référence.

empt_list = []

par exemple, vous avez une liste en tant que a_list = [1,2,3]. Pour l'effacer, procédez comme suit:

a_list = list(empt_list)

cela fera a_listune liste vide comme le empt_list.

Mounir Ben
la source
Aucune raison de créer empt_list. Utilisez simplement a_list = list ().
Daniel Harding