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!
Problem mit list.append
- 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:
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
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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...
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...
- 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.
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
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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: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?
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])
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, [.......]]]]]
Ich hoffe mal, dass die Erklärung so ausreichend war, sonst halt einfach noch mal nachhaken