Cela semble si "sale" de vider une liste de cette façon :
while len(alist) > 0 : alist.pop()
Existe-t-il un moyen clair de le faire ?
Cela semble si "sale" de vider une liste de cette façon :
while len(alist) > 0 : alist.pop()
Existe-t-il un moyen clair de le faire ?
Cette opération supprime en fait le contenu de la liste et ne remplace pas l'ancienne étiquette par une nouvelle liste vide.
del l[:]
exemple :
l1 = [1, 2, 3]
l2 = l1
del l1[:]
print(l2)
Par souci d'exhaustivité, l'affectation des tranches produit le même effet :
l[:] = []
et peut être utilisé pour réduire une partie de la liste tout en remplaçant une partie en même temps (mais cela sort du cadre de la question).
Notez que faire l = []
ne vide pas la liste, crée simplement un nouvel objet et le lie à la variable l
mais l'ancienne liste aura toujours les mêmes éléments, et l'effet sera apparent si elle avait d'autres liaisons de variables.
Deux autres questions : Qu'est-ce que "del" exactement ? (J'en déduis qu'il délivre des choses mais je ne sais pas vraiment ce que c'est) et 2ème question : Comment lisez-vous (à voix haute) [ :].
Pour une bonne explication de del, je me référerais aux docs : docs.python.org/reference/simple_stmts.html#the-del-statement
Je n'ai pas l'habitude de lire à haute voix le code python xD, mais si je devais le faire, je pense que je dirais "slice from the begining to the end of the list l".
Vous pouvez essayer :
alist[:] = []
Ce qui veut dire : Ajoutez la liste []
(0 élément) à l'endroit [:]
(tous les index du début à la fin)
Le [ :] est l'opérateur de découpage. Voir cette question pour plus d'informations.
@mitenka qui ne vide pas la liste, il écrase la variable alist
avec une liste différente qui se trouve être vide. Si quelqu'un d'autre avait une référence à la liste originale, elle reste telle quelle (c'est-à-dire qu'elle contient ce qui était dedans au départ).
@mitenka Une autre raison est que alist.clear()
ou alist[:] = []
permet de vérifier que alist
c'est vraiment une liste. Disons que vous avez alist
retourné par une fonction foo()
. Vous avez pensé foo
a retourné une liste mais en fait il a retourné un None
. Utilisation de alist = []
ne peut pas rattraper cette erreur.
il s'avère qu'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
Dans Python 2.7.2, sur ma machine, ils sont à peu près les mêmes. Ils tournent tous deux entre 13,5 et 13,7 usec par boucle.
Vous devriez également mesurer python3 -mtimeit "l=list(range(1000))" "b=l[ :]" pour calculer "b[ :] = []" et "del b[ :]". Faites-le et lol...
Non : cela ne modifiera pas la liste, cela affecte simplement une liste vide à la variable list
. Si vous attendez d'une fonction qu'elle modifie une liste transmise (par exemple), elle ne fera pas ce que vous voulez.
Pas vraiment. La question est "Comment vider une liste" et non "Comment assigner sur une variable qui contient une liste".
La question n'était pas ambiguë, le snippet de l'op faisait sortir des éléments de la liste (c'est ça, la modifier en place)...
Un autre code simple que vous pourriez utiliser (en fonction de votre situation) est le suivant :
index=len(list)-1
while index>=0:
del list[index]
index-=1
Il faut commencer l'index à la longueur de la liste et revenir en arrière plutôt que d'avoir l'index à 0, en avant, car cela donnerait un index égal à la longueur de la liste qui ne serait coupée que de moitié.
Veillez également à ce que la ligne while comporte le signe "supérieur ou égal à". Si vous l'omettez, il vous restera la liste[0].
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
28 votes
Alors pourquoi les dicts et les sets python ont-ils une méthode clear(), mais pas les listes ?
13 votes
Mais s'il y a plusieurs références à l'objet, cela peut être utile.
3 votes
Cela pourrait être utile si j'ai besoin d'effacer une liste partagée sur des processus au moment de l'exécution et que je n'ai pas besoin d'attendre le garbage collection (ou est-ce que je me trompe ? ai-je mal compris le garbage collection ?). De plus, si je veux vérifier chaque élément éclaté, je peux le déboguer alors que je ne peux pas utiliser le slicing (ou est-ce que je me trompe). Je n'ai pas besoin d'arrêter l'exécution du processus pendant que je vide ma liste.
2 votes
@S.Lott Ce n'est pas parce que vous ne comprenez pas pourquoi c'est important que le reste d'entre nous ne le comprenons pas. Si plusieurs objets dépendent d'une liste commune, c'est important. Dans plusieurs modèles de conception, c'est important. Le collecteur d'ordures signifie que vous n'avez pas à nettoyer après vous ; ce n'est pas une licence pour faire encore plus de dégâts.
4 votes
Nonobstant d'autres meilleures réponses, votre code initial aurait pu être écrit : while alist : alist.pop()