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) ]

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[:] = []

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.


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
[] []

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[:]

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


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

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[:]

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


Aucune raison de créer empt_list. Utilisez simplement a_list = list ().
Daniel Harding
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.