Exkurs - Verwaltung von Listen mit Variablen

Datenobjekte

Um zu verstehen, wie Listen in Python verarbeitet werden, 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])

>>> [4, 13, 21, 33, 34, 42]
[4, 13, 21, 33, 34, 42]

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

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 tipp1 an ein Datenobjekt mit dem Wert [4, 13, 21, 33, 34, 42] angebunden ist. Man sagt auch, dass die Variable das betreffende Datenobjekt referenziert.

aktueller Variablenzustand

Eine Variable, die ein Datenobjekt referenziert, ist eine Art 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.

>>> tipp1 = [4, 13, 21, 33, 34, 42]
>>> id(tipp1)
12289008
>>> type(tipp1)

>>> tipp1
[4, 13, 21, 33, 34, 42]

Zuweisungen

Eine Zuweisung an eine Variable wie im Beispiel tipp1 = [4, 13, 21, 33, 34, 42] führt dazu, dass die Variable an ein Datenobjekt angebunden wird.

Die folgenden Abbildungen sollen an einem konkreten Beispiel die Auswertung von Zuweisungen verdeutlichen. Verarbeitet werden Datenobjekte vom Typ list, die wir im Folgenden kurz Listenobjekte nennen.

tipp1 = [4, 13, 21, 33, 34, 42]

Die Zuweisung tipp1 = [4, 13, 21, 33, 34, 42] bindet die Variable tipp1 an ein Listenobjekt mit dem Wert [4, 13, 21, 33, 34, 42]

aktueller Variablenzustand

tipp2 = tipp1

Die Zuweisung tipp2 = tipp1 bewirkt, dass die Variable tipp2 dasselbe Listenobjekt referenziert wie die Variable tipp1.

aktueller Variablenzustand

tipp2[1] = 8

Die Zuweisung tipp2[1] = 8 bewirkt, dass die innere Struktur des von tipp2 referenzierten Listenobjekts verändert wird. Da tipp1 dasselbe Listenobjekt referenziert, wird der Wert von tipp1 hierdurch ebenfalls verändert.

aktueller Variablenzustand

tipp1 = [4, 13, 21, 33, 34, 42]

Die Zuweisung tipp1 = [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 tipp1 referenziert wird.

aktueller Variablenzustand

tipp2[0] = 3

Die Zuweisung tipp2[0] = 3 verändert jetzt nur das von tipp2 referenzierte Listenobjekt. Der Wert des von tipp1 referenzierten Listenobjekts ändert sich hierdurch nicht.

aktueller Variablenzustand

Aufgabe 1

Führe den folgenden Python-Dialog aus. Kontrolliere nach jedem Schritt die Identitätsnummern der von den Variablen verwalteten Objekte. Bestätige so die Erklärung für das merkwürdige Verhalten von Listen.

>>> tipp1 = [4, 13, 21, 33, 34, 42]
>>> tipp2 = tipp1
>>> tipp2[1] = 8
>>> tipp2
[4, 8, 21, 33, 34, 42]
>>> tipp1
[4, 8, 21, 33, 34, 42]
>>> tipp1 = [4, 13, 21, 33, 34, 42]
>>> tipp1
[4, 13, 21, 33, 34, 42]
>>> tipp2
[4, 8, 21, 33, 34, 42]
>>> tipp2[0] = 3
>>> tipp2
[3, 8, 21, 33, 34, 42]
>>> tipp1
[4, 13, 21, 33, 34, 42]

Veränderung von Listenobjekten

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.

X

Fehler melden

X

Suche