Verstehen der Gefahr, Elemente aus einer Liste während der Iteration zu entfernen
Bei dem Versuch, alle Elemente aus einer Liste zu entfernen, während darüber iteriert wird, Benutzer können auf unerwartetes Verhalten stoßen. Sehen wir uns einen Codeausschnitt an, der dieses Problem veranschaulicht:
<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>
Rätselhafterweise lautet die Ausgabe dieses Codes ['b', 'd', 'f', 'h', 'j', 'l ']. Anstatt alle Elemente zu entfernen, scheint es jedes andere Element entfernt zu haben.
Die Grundursache
Pythons Listenverständnis verhält sich in solchen Fällen anders. In der Dokumentation wird klargestellt: „Es ist nicht sicher, die Sequenz zu ändern, über die in der Schleife iteriert wird.“ Durch das Entfernen eines Elements aus der Liste während der Iteration wird der Index des nächsten Elements falsch. Folglich überspringt die Schleife ein Element, was zum beobachteten Muster führt.
Sichere Alternativen
Um alle Elemente sicher aus einer Liste zu entfernen, gibt es mehrere Optionen:
Mit del: Dieser Ansatz entfernt alle Elemente und hinterlässt eine leere Liste:
<code class="python">del letters[:]</code>
Mit Buchstaben [:] = []: Dadurch wird eine neue leere Liste erstellt und die alte verworfen:
<code class="python">letters[:] = []</code>
Eine neue Liste zuweisen: Dadurch wird erstellt ein separates Objekt:
<code class="python">letters = []</code>
Filtern der Liste: Beim selektiven Entfernen von Elementen wird empfohlen, über eine Kopie der Liste zu iterieren:
<code class="python">commands = ["ls", "cd", "rm -rf /"] for cmd in commands[:]: if "rm " in cmd: commands.remove(cmd)</code>
Alternativ kann die Liste prägnanter gefiltert werden:
<code class="python">commands = [cmd for cmd in commands if not is_malicious(cmd)]</code>
Das obige ist der detaillierte Inhalt vonWie iteriere und entferne ich Elemente sicher aus einer Python-Liste?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!