Seite 1 von 1

Problem mit list.append

Verfasst: Freitag 24. August 2007, 09:16
von enna
Hallo!

Ich habe auf 2 verschiedene Arten versucht, eine Liste an sich selbst zu appenden:

>>> L=[1]
>>> print L.append(L)
None

>>> L=[1]
>>> L.append(L)
>>> print L
[1, [...]]

Beide liefern nicht das erwartete Output, das m.E. sein sollte: [1,[1]]
Wieso? Und was bedeutet das "None", das das erste Programm ausspuckt?

Vielen Dank!

Verfasst: Freitag 24. August 2007, 09:33
von Rebecca
Zu None: die append-Funktion liefert nichts zurueck, sondern aendert direkt die Liste, auf der sie aufgerufen wird. "Nichts" ist in Python immer ein None-Objekt.

Was du suchst, ist extend. Extend fuegt zwei Listen zu einer zusammen. Append fuegt hingegen das Objekt an letzter Posistion ein, und eine Liste ist ja auch nur Objekt:

Code: Alles auswählen

In [1]: a = [1, 2, 3]
In [2]: a.append([4])
In [3]: print a
[1, 2, 3, [4]]
In [4]: a.extend([5])
In [5]: print a
[1, 2, 3, [4], 5]

Verfasst: Freitag 24. August 2007, 10:05
von enna
Hi Rebecca,

vielen Dank, das mit dem None hab ich jetzt verstanden. Hast du eine Ahnung, wieso beim zweiten Programm das Output [1, [...]] ist? Wieso schreibt Python da drei Punkte in die innere Liste?

Sorry, stell mich vielleicht blöd an, hab aber gerade erst mit dem Programmieren angefangen... :oops:

Verfasst: Freitag 24. August 2007, 10:15
von Rebecca
Was du gemacht hast (im Gegensatz zu dem Beispiel von mir): Du hast die Liste L in sich selbt eingefuegt.

Das heisst du hast dann eine Liste, deren letzter Eintrag rekursiv auf sich selbst verweist: L = [1, L] -> L = [1, [1, L]] -> L = [1, [1, [1, L]]] usw, deswegen die Punkte.

Verfasst: Freitag 24. August 2007, 10:21
von EyDu
enna hat geschrieben: Hast du eine Ahnung, wieso beim zweiten Programm das Output [1, [...]] ist? Wieso schreibt Python da drei Punkte in die innere Liste?
Kurz gesagt, liegt es daran, dass du die Liste "L" sich selbst als zusätzliches Element anhängst, wodurch eine unendlich tief verschachtelte Liste entsteht. Das liegt daran, dass mit dem Aufruf von "append" keine vollständig neue Liste erzeugt wird, sondern nur die Referenz auf diese Liste verwendet wird (also die selbe Liste). Folgendes Beispiel sollte das verdeutlichen:

Code: Alles auswählen

>>> L=[1]
>>> M=L
>>> L, M
([1], [1])
>>> id(L), id(M)
(12864928, 12864928)
>>> L.append(2)
>>> L, M
([1, 2], [1, 2])
Wie man in Zeile 5 und 6 sieht "zeigen" der Name L und M auf die selbe Liste. Fügst du nun der Liste L ein Element hinzu, wird dieses auch an M sichtbar (Zeilen 7 bis 9).

Genau so verhält es sich mit deiner Frage. Du hast eine Liste L, an welche du die Liste L anhängst. Die angehänge Liste verändert sich dadurch jedoch auch, da diese die selbe ist. Dies erkennt der Interpreter automatisch und verhindert so, dass versucht wird dir eine unendlich lange Liste auszugeben:

Code: Alles auswählen

[L, [L, [L, [L, [.......]]]]]
Hier könnte man noch mal kurz auf die Rückgabe von "None" bei "append" zurückkehren. Damit soll zusätzlich (in diesem Fall) deutlich gemacht werden, dass du mit "append" die Liste bearbeitest und keine neue erzeugst. Wäre letzteres der Fall, würde dir eine neue Liste zurückgegeben werden.

Ich hoffe mal, dass die Erklärung so ausreichend war, sonst halt einfach noch mal nachhaken :-)

Verfasst: Freitag 24. August 2007, 10:40
von enna
ok, alles klar, hab's begriffen. Vielen Dank für die ausführlichen erklärungen, das war wirklich sehr hilfreich!