Problem mit list.append

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
enna
User
Beiträge: 10
Registriert: Freitag 24. August 2007, 09:11

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!
Zuletzt geändert von enna am Freitag 24. August 2007, 09:44, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
enna
User
Beiträge: 10
Registriert: Freitag 24. August 2007, 09:11

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:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 :-)
enna
User
Beiträge: 10
Registriert: Freitag 24. August 2007, 09:11

ok, alles klar, hab's begriffen. Vielen Dank für die ausführlichen erklärungen, das war wirklich sehr hilfreich!
Antworten