Empfohlene Unterrichtsinhalte als Vorbereitung für dieses Thema: 02-03, 04-01, 08-01 (Listen, Dictionaries, Sets)
Wir haben nun schon viele Datentypen kennengelernt und mit ihnen gearbeitet. Dabei ist uns immer wieder ein Begriff begegnet: Mutability.
Der Begriff bezeichnet die Eigenschaft bestimmter Datentypen, dass
Variablenwerte dieser Typen nach der Initialisierung “in-place”
verändert werden können. In Python sind die Datentypen list
(Listen), dict
(Dictionaries), und set
(Mengen).
liste1 = [1,2,3]
liste2 = liste1
liste1.append(4)
dictionary1 = {1: "hello", 2: "world"}
dictionary2 = dictionary1
dictionary1[1] = "hi"
menge1 = {1,2,3}
menge2 = menge1
menge1.add(4)
print(liste2)
print(dictionary2)
print(menge2)
print("---")
print(liste1 == liste2)
print(dictionary1 == dictionary2)
print(menge1 == menge2)
Obwohl wir im Code-Schnipsel oben jeweils die erste Variable der
veränderbaren Datentypen nach der Initialisierung verändern, spiegelt
die zweite Variable diese Veränderung wieder. Wir dürfen hierbei nicht
vergessen, dass der Vergleichsoperator ==
nur die Werte von zwei Variablen vergleicht.
Diese Bobachtung basiert darauf, dass wir bei Variablenzuweisungen der Form variable1 = variable2
für die Variable variable2
(nur) einen Verweis auf den Speicherort von variable1
vornehmen. Die beiden Variablennamen verweisen damit auf den gleichen
Speicherort, d.h. ist mit Hilfe beider Variablennamen möglich auf ein
und den selben Wert zuzugreifen oder diesen zu verändern.
word1 = "hello"
word2 = word1
word1 = "world"
print(word1)
print(word2)
print("---")
number1 = 1
number2 = number1
number1 = 2
print(number1)
print(number2)
Bei nicht-verändernbaren Datentypen ist der Verweis auf einen
Speicherort mittels zwei oder mehr Variablennamen ebenfalls möglich.
Jedoch wird bei der Änderung des Werts einer nicht-veränderbaren
Variable für diesen neuen Wert auch ein neuer Speicherort benutzt.
Deshalb verweisen word1
und number1
nach der Zuweisung eines neuen Werts auf einen anderen Speicherort als word2
und number2
und es werden zwei verschiedene Werte ausgegeben.
id()
und der Operator is
¶Mit Hilfe der Funktion id()
lässt sich für jede Variable
deren Identität ermitteln. Die Identität ist eine Ganzzahl die jeden
Variablenwert während des Programmablaufs eineindeutig bezeichnet. Über
die Identität einer Variable lässt sich auf den Speicherort des
zugehörigen Variablenwerts schließen.
(In der Python-Implementierung die mit Hilfe der Programmiersprache C
vorgenommen wurde, entspricht die Indentität direkt dem Speicherort der
Variable.)
liste1 = [1,2,3]
liste2 = liste1
print("Die Identität der ersten Liste: " + str(id(liste1)))
print("Der Typ der Identität der ersten Liste: " + str(type(id(liste1))))
liste1.append(4)
id_liste1 = id(liste1)
id_liste2 = id(liste2)
print(id_liste1)
print(id_liste1 == id_liste2)
print(liste1 == liste2)
Da liste1
und liste2
auf den gleichen Speicherort verweisen, ist deren Identität gleich. Dies ist vor und nach der Wertänderung der Fall.
Um die Identität von zwei Variablen noch einfacher vergleichen zu können können wir den Operator is
benutzen. Er ermittelt die Identitäten der Variablen rechts und links und falls diese gleich sind, wird True
zurückgegeben, andernfalls False
.
word1 = "hello"
word2 = "world"
print(word1 == word2)
print("---")
print(word1 is word2)
Unter bestimmten Bedingungen können zwei unveränderbare Variablen die gleiche Identität haben:
word1 = "hello"
word2 = "hello"
print(word1 is word2)
Immutables des gleichen Typs und des gleichen Werts können aus Gründen der Optimierung auf den selben Speicherort verweisen, falls sie eine bestimmte Länge nicht überschreiten.
for i in range(4):
word1 = "oh"*2*i
word2 = "ohoh"*i
print("The following two words are identical: " + word1 + "\t" + word2)
print(word1 is word2)
import random
for i in range(4):
zufallszahl_stringed = str(random.randint(1,9))
n = 1
number1 = int(zufallszahl_stringed*n)
number2 = int(zufallszahl_stringed*n)
print("Der Wert von number1 und number2 ist: " + str(number1))
print(number1 is number2 )
print("---")
Unabhängige Mutables werden immer separat angelegt, auch wenn sie identische Werte haben. Zwei unabhängige Mutables haben deshalb immer auch verschiedene Identitäten.
liste1 = [1,2,3]
liste2 = [1,2,3]
print(liste1 is liste2)
print(liste1 == liste2)
id()
gibt die Identität einer Variable zurück.is
vergleicht die Identitäten von zwei Variablen und gibt True
zurück, falls sie identisch sind.