Also habe ich eine benutzerdefinierte Klasse in Python erstellt, die Iteration mit der __iter__
Methode unterstützt. Meine __iter__
Methode ist als Generatorobjekt strukturiert, wobei yield
verwendet wird, um jeden der Werte in der Instanz der Klasse anzugeben.Der Aufruf von iter() für eine Instanz meiner Klasse erzeugt keinen "Schnappschuss" der aktuellen Werte?
Ich finde, dass, wenn ich so etwas wie x = iter(my_instance)
sage und dann die Daten in meiner Instanz gespeichert bearbeiten, wenn ich anschließend eine Liste aus x
bauen, werde ich feststellen, dass die Liste der Werte enthält, die my_class
derzeit eher als die Werte, die es hatte, als ich iter()
anrief.
Also meine Frage ist an dieser Stelle zweifach. Zuallererst, ist das was passieren soll? Wenn ja, warum funktioniert es so?
Oben ist die Hauptsache, aber wenn Sie wirklich darüber hinaus gehen wollen, lesen Sie weiter. Der Grund, warum ich diese Frage stelle, ist, dass ich diese Klasse als eine Aufgabe an der Universität erstellen musste. Mein Professor hat ein Programm zur Verfügung gestellt, das eine Reihe von Tests zu dieser Klasse durchführen wird, die ich erstellt habe, um mir eine gute Vorstellung davon zu geben, ob ich es beim ersten Mal richtig gemacht habe.
Mein Programm besteht jede einzelne Prüfung mit Ausnahme der letzten, die im Grunde das oben beschriebene tut. Das Problem ist, dass erwartet wird, dass die Liste, die aus einem vorherigen Aufruf von iter(my_object)
erstellt wurde, nur die Werte widerspiegelt, die in my_object
zu dem Zeitpunkt gespeichert wurden, zu dem iter()
aufgerufen wurde.
Meine erste Reaktion, nachdem diese mit Blick auf war, dass mein Professor ähnlich ein Ergebnis kommen sollte einfach list(my_object)
anrufen, aber ich bin der Student hier, so scheint es viel wahrscheinlicher, ich einfach in einige sehr seltsam, meine __iter__
Methode kodiert Weg, der dieses Verhalten verursacht. Oder hat Python geändert, wie die iter()
Funktion in letzter Zeit funktioniert?
Ich würde es vorziehen, nicht meinen Code zu schreiben, da es für eine Klasse ist, und dass technisch betrachtet werden könnte betrüge (ich weiß, das ist dumm und wenig hilfreich, sorry). Allerdings kann ich die Spezifikation verknüpfen, die richtig ist here (speziell Teil 1, die Bag
Klasse).
Ihr Iterator und Ihre Klasse verwenden dasselbe zugrunde liegende Listenobjekt für den Speicher. Aus diesem Grund sehen beide Änderungen, wenn Sie die Daten ändern. – Nayuki
Wenn Sie den Iterator "einfrieren" möchten, können Sie ihn explizit in eine Liste (oder einen anderen konsumierenden Datentyp) konvertieren. Iteratoren sind normalerweise faul, was erklärt, warum Sie das beschriebene Verhalten haben. –
Wenn Sie über veränderbare Objekte iterieren (und Ihr Bag ist veränderbar), werden auch Iteratoren aus der Standardbibliothek das gleiche Verhalten zeigen: Sie werden auf dem iterablen im aktuellen Zustand operieren, was Modifikationen widerspiegelt. – Cyb3rFly3r