Comprendre le danger de supprimer des éléments d'une liste pendant une itération
Pour tenter de supprimer tous les éléments d'une liste tout en la parcourant, les utilisateurs peuvent rencontrer un comportement inattendu. Examinons un extrait de code qui illustre ce problème :
<code class="python">letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] for i in letters: letters.remove(i) print(letters)</code>
Curieusement, le résultat de ce code est ['b', 'd', 'f', 'h', 'j', 'l ']. Au lieu de supprimer tous les éléments, il semble avoir supprimé tous les autres éléments.
La cause profonde
La compréhension de la liste de Python se comporte différemment dans de tels cas. Comme le précise la documentation, "Il n'est pas sûr de modifier la séquence itérée dans la boucle." En supprimant un élément de la liste lors d'une itération dessus, l'index de l'élément suivant devient incorrect. Par conséquent, la boucle saute un élément, conduisant au modèle observé.
Alternatives sûres
Pour supprimer en toute sécurité tous les éléments d'une liste, il existe plusieurs options :
Utilisation de del : Cette approche supprime tous les éléments et laisse une liste vide :
<code class="python">del letters[:]</code>
Utilisation de lettres [:] = []: Cela crée une nouvelle liste vide, en supprimant l'ancienne :
<code class="python">letters[:] = []</code>
Attribuer une nouvelle liste : Cela crée un objet séparé :
<code class="python">letters = []</code>
Filtrer la liste : Lors de la suppression sélective d'éléments, il est recommandé de parcourir une copie de la liste :
<code class="python">commands = ["ls", "cd", "rm -rf /"] for cmd in commands[:]: if "rm " in cmd: commands.remove(cmd)</code>
Vous pouvez également filtrer la liste de manière plus concise :
<code class="python">commands = [cmd for cmd in commands if not is_malicious(cmd)]</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!