Seite 1 von 1

Listen und die append Funktion

Verfasst: Montag 23. September 2013, 00:43
von ???
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!!!

Re: Listen und die append Funktion

Verfasst: Montag 23. September 2013, 07:25
von snafu
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.

Re: Listen und die append Funktion

Verfasst: Montag 23. September 2013, 07:30
von Sirius3
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.

Re: Listen und die append Funktion

Verfasst: Montag 23. September 2013, 23:29
von ???
Vielen Dank!!! Jetzt bin ich schon viel schlauer :D