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.