Ich arbeite an einem Py-Skript, das Zeilen aus einer CSV-Datei einliest, manipuliert und wieder ausgibt. Bisher habe ich die csv um die Konvertierung zu listen.Warum ändert eine for-Schleife in Python nicht referenzierte Listen?
Das Problem, das ich habe, ist, wenn ich über die temporären Listen iteriere, ändern die for-Schleifen alle Temp-Listen, anstatt nur die eine, die ich will. Hier ist ein einfaches Beispiel für das, was ich sagen möchte.
>>> l = [['hi', 'ho'],['no', 'go']]
>>> t = []
>>> y = []
>>>
>>> for row in l:
... row[0] = '123'
... y.append(row)
... t.append(row)
...
>>> y
[['123', 'ho'], ['123', 'go']]
>>> t
[['123', 'ho'], ['123', 'go']]
Also das obige ist einfach (hoffentlich). (Nehmen wir an, ich möchte andere Dinge tun, als nur die Liste zu kopieren. Ich wollte es einfach halten).
Aber jetzt ist hier der Teil, den ich nicht bekomme.
>>> z = []
>>> for row in y:
... row[0] = 'xxxx'
... z.append(row)
...
>>> z
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> t
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> y
[['xxxx', 'ho'], ['xxxx', 'go']]
Wenn ich will den ersten Teil in den Unterlisten ändern, und es zu einer neuen Liste ‚z‘ speichern, ändert es die Liste t, wie gut!
Was geht hier vor? Sind z, y und t auf den gleichen Speicherort?
Auch was hier passiert ?:
>>> for rowx in y:
... rowx[0] = 'x55x'
... z.append(rowx)
...
>>> z
[['xxxx', 'ho'], ['x55x', 'go'], ['x55x', 'go'], ['x55x', 'go']]
>>> t
[['xxxx', 'ho'], ['x55x', 'go']]
>>> y
[['xxxx', 'ho'], ['x55x', 'go']]
auf die obige Frage ähnliche, warum y und t geändert zu werden?
Vielen Dank im Voraus!
Für eine flache Kopie von Listen können Sie 'y [:]' – SingleNegationElimination
Dank jleedev! Während [:] beantwortet und meine Frage gelöst hat, tut das auch Ihre Kopie.deepcopy Lösung, was ich in meinem Skript machen musste, da eine seichte Kopie (anscheinend) nicht genug war. Du hast mein Problem gelöst! :) – RaytheonLiszt
@Raytheon Die '[:]' Scheibe, eine einfache 'for' Schleife und eine seichte Kopie haben alle genau den gleichen Effekt. –