Exkurs - Liste als Objekt
Eine Liste kopieren
Wie kopiert man eine Liste? Das ist gar nicht so einfach, wie der folgende Python-Dialog zeigt.
>>> liste1 = ['a', 'b', 'c']
>>> liste2 = liste1
>>> liste2[1] = 'd'
>>> liste2
['a', 'd', 'c']
>>> liste1
['a', 'd', 'c']
Aufgabe 1
(a) Probiere das selbst aus. Warum ist das Ergebnis hier unbefriedigend?
(b) Hier ein erneuter Versuch, eine Kopie einer vorgegebenen Liste zu erzeugen. Vergleiche mit Version 1. Was ist hier anders gemacht?
>>> liste1 = ['a', 'b', 'c']
>>> liste2 = liste1[0:len(liste1)]
>>> liste2[1] = 'd'
>>> liste2
['a', 'd', 'c']
>>> liste1
['a', 'b', 'c']
(c) Führe entsprechende Experimente mit dem Online Python Tutor durch. Gib z.B. den folgenden Python-Quelltext ein.
L = ['a', 'b', 'c']
M = L
M[0] = 'd'
Beobachte und erkläre die angezeigten Ergebnisse.
Verwaltung von Listen mit Variablen
Um die oben gezeigten Ergebnisse zu verstehen, muss man sich zunächst damit vertraut machen, wie Datenobjekte in Python mit Hilfe von Variablen verwaltet werden.
Jedes Datenobjekt hat (in Python) eine Identitätsnummer, einen Typ und einen bestimmten Wert. Der folgende Python-Dialog zeigt, wie man sich diese Informationen über ein Datenobjekt in Python verschaffen kann.
>>> id([4, 13, 21, 33, 34, 42])
12289008
>>> type([4, 13, 21, 33, 34, 42])
<type 'list'="">
>>> [4, 13, 21, 33, 34, 42]
[4, 13, 21, 33, 34, 42]
</type>
Die Identitätsnummer eines Datenobjekts erhält man mit dem id
-Operator, den
Typ des Datenobjekts man mit dem type
-Operator. Den Wert erhält man,
wenn man seine Darstellung auswerten lässt.
Beachte, dass es mehrere Datenobjekte mit demselben Typ und Wert geben kann. Diese unterscheiden sich aber in der Identitätsnummer.
>>> id([4, 13, 21, 33, 34, 42])
12289008
>>> id([4, 13, 21, 33, 34, 42])
12288448
Jeder Aufruf des Ausdrucks [4, 13, 21, 33, 34, 42]
erzeugt hier ein neues
Datenobjekt, das sich dann in der Identitätsnummer von anderen Datenobjekten mit demselben Wert unterscheidet.
Variablen dienen in der Informatik dazu, Datenobjekte zu verwalten.
Variablen werden an Datenobjekte angebunden
, um die betreffenden Datenobjekte verwalten
zu können.
Die folgende Abbildung zeigt eine solche Situation, bei der die Variable liste1
an ein Datenobjekt mit dem Wert [4, 13, 21, 33, 34, 42]
angebunden ist. Man sagt
auch, dass die Variable das betreffende Datenobjekt referenziert.
Eine Variable, die ein Datenobjekt referenziert, ist ein Name für das betreffende Datenobjekt. Das sieht man im folgenden Python-Dialog. Mit dem Variablennamen kann man sich die Identitätsnummer, den Typ und den Wert des referenzierten Datenobjekts verschaffen.
>
>>> liste1 = [4, 13, 21, 33, 34, 42]
>>> id(liste1)
12289008
>>> type(liste1)
<type 'list'="">
>>> liste1
[4, 13, 21, 33, 34, 42]
</type>
Eine Zuweisung an eine Variable wie im Beispiel
liste1 = [4, 13, 21, 33, 34, 42]
führt dazu, dass die Variable an ein Datenobjekt angebunden
wird.
Listen als veränderbare Datenobjekte
Die folgenden Abbildungen sollen an einem konkreten Beispiel die Auswertung von Zuweisungen verdeutlichen, bei denen u.a. auch die interne Struktur von Listenobjekten verändert wird.
liste1 = [4, 13, 21, 33, 34, 42]
Die Zuweisung liste1 = [4, 13, 21, 33, 34, 42]
bindet die Variable liste1
an ein Listenobjekt mit dem Wert [4, 13, 21, 33, 34, 42]
liste2 = liste1
Die Zuweisung liste2 = liste1
bewirkt, dass die Variable liste2
dasselbe Listenobjekt referenziert
wie die Variable liste1
.
liste2[1] = 8
Die Zuweisung liste2[1] = 8
bewirkt, dass die innere Struktur des von liste2
referenzierten Listenobjekts verändert wird. Da liste1
dasselbe Listenobjekt referenziert,
wird der Wert von liste1
hierdurch ebenfalls verändert.
liste1 = [4, 13, 21, 33, 34, 42]
Die Zuweisung liste1 = [4, 13, 21, 33, 34, 42]
bewirkt, dass ein neues Listenobjekt mit
dem Wert [4, 13, 21, 33, 34, 42]
erzeugt wird und von der Variablen liste1
referenziert wird.
liste2[0] = 3
Die Zuweisung liste2[0] = 3
verändert jetzt nur das von liste2
referenzierte Listenobjekt. Der Wert des von liste1
referenzierten Listenobjekts ändert sich
hierdurch nicht.
Veränderung bestehender Listenobjekte
Eine Zuweisung der Gestalt L[i] = ...
verändert den Wert des von L
referenzierten Listenobjekts. Das Listenobjekt selbst bewahrt aber seine Identität, wie der
folgende Python-Dialog zeigt
>>> L = ['a', 'b']
>>> id(L)
12282776
>>> L[0] = 'c'
>>> L
['c', 'b']
>>> id(L)
12282776
Erzeugung neuer Listenobjekte
Ein Listenobjekt mit dem Wert ['a', 'b']
kann auf unterschiedliche Weise erzeugt werden.
Der folgende Python zeigt einige Möglichkeiten.
>>> ['a', 'b']
['a', 'b']
>>> ['a']+['b']
['a', 'b']
>>> ['a', 'b'][0:2]
['a', 'b']
>>> id(['a', 'b'])
12291048
>>> id(['a']+['b'])
12283536
>>> id(['a', 'b'][0:2])
12288848
Beachte, dass jede Erzeugung zu einem neuen Datenobjekt führt. Das sieht man an den unterschiedlichen Identitätsnummern.