Il semble si "sale" vider une liste de cette façon:
while len(alist) > 0 : alist.pop()
Existe-t-il un moyen clair de le faire?
Cela supprime le contenu de la liste, mais ne remplace pas l'ancienne étiquette par une nouvelle liste vide:
del lst[:]
Voici un exemple:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Par souci d’exhaustivité, l’affectation de tranche a le même effet:
lst[:] = []
Il peut également être utilisé pour réduire une partie de la liste tout en remplaçant une partie en même temps (mais cela n’entre pas dans le cadre de la question).
Notez que faire lst = []
ne vide pas la liste, crée simplement un nouvel objet et le lie à la variable lst
, mais l'ancienne liste aura toujours les mêmes éléments et l'effet sera apparent s'il avait autres liaisons variables.
Si vous utilisez Python3.3 ou supérieur, vous pouvez utiliser la méthode clear()
de list
, parallèle à clear()
de dict
, set
, deque
et d'autres types de conteneurs mutables:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Selon la page de documentation liée, il est également possible d’obtenir la même chose avec alist *= 0
.
Pour résumer, il existe quatre manières équivalentes de nettoyer une liste sur place (ce qui est tout à fait contraire au Zen of Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Tu pourrais essayer:
alist[:] = []
Ce qui signifie: Splice dans la liste []
(0 éléments) à l'emplacement [:]
(tous les index du début à la fin)
Le [:] est l'opérateur de tranche. Voir cette question pour plus d'informations.
il s'avère que, avec python 2.5.2, del l[:]
est légèrement plus lent que l[:] = []
de 1,1 usec.
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
lst *= 0
a le même effet que
lst[:] = []
C'est un peu plus simple et peut-être plus facile à retenir. Autre que cela il n'y a pas grand chose à dire
L'efficacité semble être à peu près la même
list = []
réinitialisera list
dans une liste vide.
Notez que vous ne devez généralement pas masquer les noms de fonctions réservées, tels que list
, qui est le constructeur d'un objet de liste. Vous pouvez par exemple utiliser lst
ou list_
.