Il y a un problème subtil de changement de séquence dans une boucle de commentaires (cela ne peut se produire qu'avec des séquences mutables, par exemple des listes). Un compteur interne est utilisé pour garder une trace de quel élément est utilisé ensuite, et ce compteur est incrémenté à chaque itération. La boucle se termine lorsque ce compteur atteint la longueur de la séquence. À partir de là, la suppression de l'élément actuel (ou précédent) de la séquence dans la suite saute l'élément suivant (car la position de l'élément suivant est l'index de l'élément actuel qui a déjà été traité). Ce sera. De même, si vous insérez un élément dans la suite avant l'élément courant dans la séquence, l'élément courant sera traité à nouveau dans la semaine suivante de la boucle. Ces spécifications conduisent à des bugs désagréables. Cela peut être évité en effectuant une copie temporaire en utilisant des tranches de la séquence entière.
officiel.py
for x in a[:]:
if x < 0: a.remove(x)
L'élément de foo_list
qui est retourné par l'instruction for a été supprimé dans la séquence.
Cela peut empêcher la liste d'être tournée vers la fin.
bug.py
for i in foo_list:
if thres >= i:
foo_list.remove(i)
Commencez par activer toutes les instructions for. Notez l'élément que vous souhaitez effacer. Tournez le contenu du mémod avec pour pour le supprimer.
Gênant
no_good.py
memo = []
for i in range(len(foo_list)):
if thres >= foo_list[i]:
memo.append(foo_list[i])
for item in memo:
foo_list.remove(item)
Créez un nouvel objet de liste en découpant toute la plage de la liste spécifiée par l'instruction for C'est la même chose que ʻa = foo_list [:] `quand vous voulez copier
beautiful.py
for i in foo_list[:]:
if thres >= i:
foo_list.remove(i)
Au fait, si vous souhaitez simplement filtrer comme ci-dessus, la notation d'inclusion est meilleure comme indiqué par @shiracamus ci-dessous. Ensuite, j'ajouterai l'histoire de son utilisation à nouveau.
@shiracamus Ne serait-il pas plus rapide de créer une nouvelle liste en inclusion que de la supprimer de la liste?
foo_list = [i for i in foo_list if thres >= i]
Recommended Posts