Comment itérer et supprimer en toute sécurité des éléments d'une liste Python ?

Susan Sarandon
Libérer: 2024-10-19 11:52:29
original
583 Les gens l'ont consulté

How to Safely Iterate and Remove Items from a Python List?

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>
Copier après la connexion

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 :

  1. Utilisation de del : Cette approche supprime tous les éléments et laisse une liste vide :

    <code class="python">del letters[:]</code>
    Copier après la connexion
  2. Utilisation de lettres [:] = []: Cela crée une nouvelle liste vide, en supprimant l'ancienne :

    <code class="python">letters[:] = []</code>
    Copier après la connexion
  3. Attribuer une nouvelle liste : Cela crée un objet séparé :

    <code class="python">letters = []</code>
    Copier après la connexion
  4. 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>
    Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!