Listen und die append Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
???
User
Beiträge: 2
Registriert: Montag 23. September 2013, 00:24

Hallo Leute,

ich bin noch kompletter Neuling in Python und es würde mich nicht wundern wenn meine Frage schon mal gestellt wurde, allerdings habe ich weder mit Literatur, noch google noch Foreneintrgen mein Problem lösen können. Vielleicht habe ich auch einfach nach den falschen Begriffen gesucht...

Hier die Frage:

Ich habe vollgenden Code:

Code: Alles auswählen

file = [[1,2,3], [4,5,6], [7,8,9]]
list = []
newfile = []

for i in file: 
    list += i
    newfile.append(list)
Wenn ich das mal printe erhalte ich:

list = [1,2,3,4,5,6,7,8,9]
newfile = [[1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9]]

Was ich aber haben möchte ist:

newfile = [[1,2,3], [1,2,3,4,5,6], [1,2,3,4,5,6,7,8,9]]

Wenn ich list in der for Schleife printe, dan kommt auch genau das heraus, deswegen verstehe ich nicht, warum append nicht genau das dran hängt :K

Ich danke euch im Voraus für eure Hilfe!!!
Zuletzt geändert von Anonymous am Montag 23. September 2013, 10:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, es wird mit dem `.append()` bei dir nicht der aktuelle Inhalt einer Liste angehangen, sondern die Liste an sich. Wenn du also die Liste in dem Moment anhängst, wo sie 3 Elemente hat, aber die selbe Liste später erweiterst, dann bezieht sich das immer auch auf die zuvor angehangene Liste (EDIT: Genau genommen wurde nämlich gar keine Liste angehangen, sondern lediglich ein *Verweis* auf die zuvor erstellte Liste -- Wenn man sich das mit dem Verweis klargemacht hat, dann sollte man auch besser verstehen können, was da eigentlich genau passiert bzw warum es zu dem dich verwundernden Verhalten kommt). Du hast letzlich also eine "Oberliste", die als Inhalt mehrfach hintereinander exakt das selbe Objekt enthält. Für das, was du möchtest, müsstest du explizit neue Listen erstellen. Im Prinzip kann man das ganz einfach haben:

Code: Alles auswählen

result = []
with open(pfad_zur_datei) as f:
    result.append(list(f))
`list(f)` erzeugt eine Liste, die alle Zeilen des Dateiobjektes als Listenelemente enthält. Dies sollte ziemlich genau das tun, was du erwartest, falls ich dich nicht falsch verstanden habe.
Zuletzt geändert von snafu am Montag 23. September 2013, 09:12, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo ???,
über Dein Problem stolpert fast jeder Anfänger mindestens einmal. Deine Liste list gibt es nur einmal im Speicher, mit append wird nur ein Verweis auf diese Liste an newfile angehängt. Das sieht man schön an diesem Beispiel, wo die Variablen liste_A und liste_B zwar verschiedene Namen sind, aber auf die selbe Liste verweisen:

Code: Alles auswählen

In [1]: liste_A = [1,2,3]

In [2]: liste_B = liste_A

In [3]: liste_B.append(4)

In [4]: liste_A
Out[4]: [1, 2, 3, 4]

In [5]: liste_C = list(liste_A) # Kopie

In [6]: liste_C.append(5)

In [7]: liste_A
Out[7]: [1, 2, 3, 4]

In [8]: liste_C
Out[8]: [1, 2, 3, 4, 5]
liste_C ist dagegen eine Kopie von liste_A und kann deshalb unabhängig verändert werden.

Nun zu Deinen Namen: Du solltest Variablen nicht wie eingebaute Funktionen nennen (list, file) und i bezeichnet normalerweise nur einen Index und nicht ein Element einer Liste.
???
User
Beiträge: 2
Registriert: Montag 23. September 2013, 00:24

Vielen Dank!!! Jetzt bin ich schon viel schlauer :D
Antworten