Es gibt ein subtiles Problem beim Ändern von Sequenzen in einer Kommentarschleife (dies kann nur bei veränderlichen Sequenzen geschehen, z. B. Listen). Ein interner Zähler wird verwendet, um zu verfolgen, welches Element als nächstes verwendet wird, und dieser Zähler wird bei jeder Iteration inkrementiert. Die Schleife endet, wenn dieser Zähler die Länge der Sequenz erreicht. Wenn Sie das aktuelle (oder vorherige) Element aus der Sequenz in der Suite entfernen, wird das nächste Element übersprungen (da die Position des nächsten Elements der Index des aktuellen Elements ist, das bereits verarbeitet wurde). Es wird sein. Wenn Sie ein Element in die Suite vor dem aktuellen Element in der Sequenz einfügen, wird das aktuelle Element in der nächsten Woche der Schleife erneut behandelt. Diese Spezifikationen führen zu bösen Fehlern. Dies kann vermieden werden, indem eine temporäre Kopie mit Slices der gesamten Sequenz erstellt wird.
offiziell.py
for x in a[:]:
if x < 0: a.remove(x)
Das Element von foo_list
, das von der for-Anweisung gedreht wird, wurde in der Sequenz gelöscht.
Dies kann verhindern, dass die Liste bis zum Ende gedreht wird.
bug.py
for i in foo_list:
if thres >= i:
foo_list.remove(i)
Drehen Sie zuerst alle for-Anweisungen. Notieren Sie sich das Element, das Sie löschen möchten. Drehen Sie den Memod-Inhalt mit für, um ihn zu löschen.
** Problematisch **
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)
Erstellen Sie ein neues Listenobjekt, indem Sie den gesamten Bereich der durch die for-Anweisung angegebenen Liste aufteilen Es ist dasselbe wie "a = foo_list [:]" zu sagen, wenn Sie kopieren möchten
beautiful.py
for i in foo_list[:]:
if thres >= i:
foo_list.remove(i)
Übrigens, wenn Sie nur wie oben filtern möchten, ist die Einschlussnotation besser, wie von @shiracamus unten hervorgehoben. Dann werde ich die Geschichte hinzufügen, ihn wieder zu benutzen.
@shiracamus Ist es nicht schneller, eine neue Liste mit Einschlussnotation zu erstellen, als sie aus der Liste zu entfernen?
foo_list = [i for i in foo_list if thres >= i]
Recommended Posts