i

Exkurs - Hinweise zur Verarbeitung von Listen

Vorsicht - Liste!

Listen können sich manchmal etwas merkwürdig verhalten - sofern man ihre Verarbeitung nicht ganz durchschaut. Daher ist es wichtig, über Strategien im Umgang mit Listen zu verfügen.

Erzeugung neuer Listen

Oft ist es günstig, wenn man alle benutzten Listen mit Hilfe geeigneter Operationen neu erzeugt. Zuweisungen an Variablen sollten dann immer vom Typ L = ... sein, wobei ... ein funktionaler Ausdruck ist, der eine Listenkonstruktion beschreibt. Hier kann z. B. eine Aufzählung der Listenelemente stehen wie im Beispiel L = [0, 1, 2], oder es kann eine Konkatenation von Listen stehen wie im Beispiel L = L + [4], oder es kann die Erzeugung einer Teilliste stehen wie im Beispiel L = L[1:], oder auch eine komplizierte Mischung von Operationen wie im Beispiel L = [1, 2] + L[1:].

>>> L = [1, 2, 3]
>>> L
[1, 2, 3]
>>> id(L)
12283056
>>> L = L + [4]
>>> L
[1, 2, 3, 4]
>>> id(L)
12289008
>>> L = L[1:]
>>> L
[2, 3, 4]
>>> id(L)
12257720
>>> L = [1, 2] + L[1:]
>>> L
[1, 2, 3, 4]
>>> id(L)
12289008

In jedem dieser Fälle wird erst der funktionale Ausdruck auf der rechten Seite der Zuweisung ausgewertet. Diese Auswertung erzeugt eine neue Liste, die dann von der Variablen auf der linken Seite der Zuweisung verwaltet wird.

Veränderung einer bestehenen Liste

Wenn man sich für eine objektorientierte Vorgehensweise entscheidet, dann werden durch Listenoperationen vom Typ liste.operation nur die Werte von Listenobjekten verändert, aber keine neuen Listenobjekte erzeugt. Beachte, dass eine Zuweisungen vom Typ L[i] = ... einem Aufruf L.__setitem__(i, ...) entspricht und so ebenfalls nur die aktuelle Liste verändert.

>>> L = [1, 2, 3]
>>> L
[1, 2, 3]
>>> id(L)
12283536
>>> L[1] = 5
>>> L
[1, 5, 3]
>>> id(L)
12283536
>>> L.remove(5)
>>> L
[1, 3]
>>> id(L)
12283536
>>> L.insert(1, 2)
>>> L
[1, 2, 3]
>>> id(L)
12283536

Bei der Verwaltung von Listen mit Variablen ist zu beachten, dass Variablen Namen sind. Eine Zuweisung vom Typ M = L erzeugt also keine neue Liste, sondern nur einen weiteren Namen für die von L referenzierte Liste. Das kann manchmal ganz praktisch sein, kann aber auch zu schwer auffindbaren Fehlern führen.

Suche

v
4.2.2.4
www.inf-schule.de/algorithmen/listen/listenalsobjekte/exkurs_listenverarbeitung
www.inf-schule.de/4.2.2.4

Rückmeldung geben