Ä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 Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie nicht ändern der Liste, so zu sprechen. Sie sind einfach das modifizieren der Elemente in der Liste. Ich glaube nicht, dass das ein problem.
Zur Beantwortung Ihrer zweiten Frage, beide Wege sind ja erlaubt (wie Sie wissen, seitdem Sie lief der code), aber es hängt von der situation. Der Inhalt veränderlich oder unveränderlich sind?
Zum Beispiel, wenn Sie möchten, fügen Sie jedes element in einer Liste von Integer-zahlen, das würde nicht funktionieren:
Tatsächlich
int
s sind unveränderliche Objekte. Stattdessen müssten Sie Durchlaufen die Indizes und ändern Sie das element bei jedem index, wie diese:Wenn Ihr Artikel verändert, dann wird die erste Methode (direkt Iteration über die Elemente eher als die Indizes) effizienter ist, ohne Zweifel, weil Sie den zusätzlichen Schritt der Indizierung ist ein Aufwand, der vermieden werden kann, da diese Elemente sind veränderlich.
Du bist nicht die änderung der Liste in alle Weise. Was Sie sind geändert wird, ist die Elemente in der Liste; Das ist völlig in Ordnung. Solange Sie nicht direkt ändern, die tatsächliche Liste, bist du gut.
Es gibt keine Notwendigkeit, Durchlaufen die Indizes. In der Tat, das ist unidiomatic. Es sei denn, Sie sind wirklich versucht zu ändern, die Liste selbst, einfach die Liste Durchlaufen, indem Sie Wert.
Absolut. Für die exakt gleichen Gründen wie ich oben sagte. Nicht verändern
lovely_numbers
selbst. Vielmehr sind Sie nur die änderung der Elemente inlovely_numbers
.Beispiele, wo die Liste geändert wird und nicht während während der Iteration über die Elemente der Liste
list_modified_during_iteration.py
list_not_modified_during_iteration.py (Geändert Element zu ich)
Natürlich, können Sie. Der erste Weg ist normal, aber in einigen Fällen können Sie auch verwenden, Liste Verstehens oder
map()
.