Seite 1 von 1

unendlich große listen?

Verfasst: Montag 1. Januar 2007, 03:29
von Krux
Wenn ich eine Liste in sich selbst speichere, dann wird sie als referenz auf sich selbst gespeichert, anstatt den aktuellen Stand der Liste hineinzuspeichern, wie das bei Tupeln der Fall ist. Da hab ich mal so ne frage: Ist es möglich, das einem das auch was nützt, z-b. dass sich da dann andere veränderte werte der Liste befinden, als sie im original waren? also z.B. eine Liste die alle Fibonachizahlen enthält oder so?

Verfasst: Montag 1. Januar 2007, 05:39
von cracki
listen kopieren geht so:

Code: Alles auswählen

kopierteliste = neliste[:]
ansonsten stell deine frage bitte nochmal, aber klarer.

Re: unendlich große listen?

Verfasst: Montag 1. Januar 2007, 11:33
von BlackJack
Krux hat geschrieben:Wenn ich eine Liste in sich selbst speichere, dann wird sie als referenz auf sich selbst gespeichert, anstatt den aktuellen Stand der Liste hineinzuspeichern, wie das bei Tupeln der Fall ist.
Das klingt nach einem Missverständnis. Auch in Tupeln werden nur Referenzen gespeichert. Du kannst in einem Tupel aber keine Referenz auf das Tupel selbst speichern, weil alles was Du in ein Tupel packst, schon existieren muss bevor das Tupel an den Namen gebunden wird. Wenn das Tupel "fertig" ist, hast Du zwar einen Namen, kannst den aber nicht benutzen um das Tupel "in sich selbst" zu stecken, weil Tupel "immutable", d.h. nicht veränderbar sind.
Da hab ich mal so ne frage: Ist es möglich, das einem das auch was nützt, z-b. dass sich da dann andere veränderte werte der Liste befinden, als sie im original waren? also z.B. eine Liste die alle Fibonachizahlen enthält oder so?
Wie sollte das passieren!? Nach folgendem Code...

Code: Alles auswählen

In [6]: a = [1, 2, 3]

In [7]: a[2] = a

In [8]: a
Out[8]: [1, 2, <Recursion on list with id=-1214990132>]
...sieht's im Speicher so aus:

Code: Alles auswählen

   Namen  |  Objekte             +-----+-+
                         +------>|<int>|1|
          |              |       +-----+-+
                         |       +-----+-+
          |              | +---->|<int>|2|
                         | |     +-----+-+
    +-+   |      +------+|+|+-+
    |a|--------->|<list>|o|o|o|
    +-+   |  +-->+------+-+-+|+
             |               |
          |  +---------------+

          |
Es gibt sicher auch Fälle wo so eine Referenz auf sich selbst nützlich sein kann.

Verfasst: Montag 1. Januar 2007, 14:07
von Krux
ja genau so, nur was bringt einem das, wenn das Element als letztes in der liste genau das selbe ist, wie die liste selbst? Ich suche nach einem Praktischen anwendungsbeispiel dafür. In der Uni hatten wir listen (in einen anderen Programmiersprache tScheme), die enthielten z.B. alle Fibonacizahlen, und waren somit unendlich lang. Die hat man rekursiv aufgebaut, nur wurde die rekursion erst bein aufrufen der listenelemente durchgeführt, und nicht beim erstellewn der liste. Da ist mir die Idee gekommen, das es sowas vieleicht auch geben könnte in Python, denn so bringt einem das ganze recht wenig.

Verfasst: Montag 1. Januar 2007, 15:47
von Luzandro
Im Grunde entspricht das Generatoren: http://docs.python.org/tut/node11.html# ... 0000000000

Verfasst: Montag 1. Januar 2007, 17:07
von BlackJack
Krux hat geschrieben:ja genau so, nur was bringt einem das, wenn das Element als letztes in der liste genau das selbe ist, wie die liste selbst? Ich suche nach einem Praktischen anwendungsbeispiel dafür.
Mit verschachtelten Listen lassen sich Bäume modellieren. Wenn man Referenzen auf die Listen selbst in die Listen steckt, kann man beliebige Graphen modellieren.