Ändern Sie die Liste während der Iteration

Ich weiß, sollte man nicht hinzufügen/entfernen von Elementen während der Iteration über eine Liste. Aber kann ich das ändern eines Elements in einer Liste bin ich Durchlaufen, wenn ich nicht die Liste ändern der Länge?

class Car(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return type(self).__name__ + "_" + self.name

my_cars = [Car("Ferrari"), Car("Mercedes"), Car("BMW")]
print(my_cars)  # [Car_Ferrari, Car_Mercedes, Car_BMW]
for car in my_cars:
    car.name = "Moskvich"
print(my_cars)  # [Car_Moskvich, Car_Moskvich, Car_Moskvich]

Oder sollte ich die Liste Durchlaufen Indizes statt? So:

for car_id in range(len(my_cars)):
    my_cars[car_id].name = "Moskvich"

Die Frage ist: sind die beiden Möglichkeiten, wie oben erlaubt oder nur das zweite ist fehlerfrei?

Wenn die Antwort ja ist, wird der folgende Abschnitt gültig sein?

lovely_numbers = [[41, 32, 17], [26, 55]]
for numbers_pair in lovely_numbers:
    numbers_pair.pop()
print(lovely_numbers)  # [[41, 32], [26]]

UPD. Ich möchte sehen, wie der python-Dokumentation, wo es heißt "diese Operationen erlaubt sind," sondern als jemand, der seine Vermutungen.

  • Ja, solange Sie sich nicht ändern, die Länge, die Sie nicht auf Probleme stoßen. Das Letzte Stück läuft man in eine IndexError wenn Ihre Liste leer ist, bevor Sie pop.
  • Die Dokumentation würde auch nicht erwähnen, dass mutierenden die Größe erlaubt ist oder nicht. Es ist. Alle diese Operationen erlaubt sind, sonst würden Sie bekommen einen syntax-Fehler. Es ist eine Frage des Stils-und was Sie nicht tun sollten als ein guter Programmierer.
  • Sie haben bereits zwei Antworten, die sagen, dass die änderung einer Liste selbst anders ist, als die Bearbeitung der Elemente innerhalb der Liste. Das ist richtig, aber vielleicht zu verwirrend für einige Leute. Es könnte helfen, sich daran zu erinnern, dass die Listen enthalten nur Referenzen (d.h. Verweise). Zur weiteren Lektüre empfehle ich diesem Artikel von Ned Batchelder.
InformationsquelleAutor dizcza | 2017-07-01
Schreibe einen Kommentar