@MagBen: Danke für den guten Zuspruch.
Nur um kurz das Problem mit dem Unterschied zwischen "==" und einem "is" ausformuliert zu haben.
Der Ausdruck "==" prüft ob der Wert zweier Objekte gleich ist, während "is" prüft ob zwei Referenzen auf das selbe Objekt verweisen. Leider führen die Bücher für Anfänger, zumindest jene die ich gelesen habe, gar nicht genauer aus, was der Unterschied zwischen Referenzen und Objekten ist. Oftmals stoße ich auch hier auf Probleme die mit dieser Thematik zu tun haben.
Beispiel 1:
Code: Alles auswählen
a = 1
b = 1
print('a == b:', a == b) # True
print('a is b:', a is b) # True
Als Ausgabe erhalten wir ausschließlich "True". Man könnte nun ohne weiteres Wissen vermuten, dass "is" das Gleiche wie "==" ist.
Um nun den Unterschied zu verdeutlichen machen wir das selbe Spiel mit einer Liste: (Beispiel 2)
Code: Alles auswählen
a = [1]
b = [1]
print('a == b:', a == b) # True
print('a is b:', a is b) # False
Jetzt erhalten wir plötzlich bei "a is b" ein False obwohl beide Listen identisch erstellt wurden und auch den gleichen Wert besitzen("==" ist "True").
Was ist nun schief gelaufen? Die Antwort ist relativ einfach, wenn man das Prinzip einmal verstanden hat. Der Interpreter schreibt den gespeicherten Wert(im ersten Beispiel "1") in den Arbeitsspeicher. Dieser Wert heißt Objekt und wird komplett vom Python Interpreter verwaltet. Für uns erstellt der Interpreter eine Referenz auf die wir mit seinem Namen('a', 'b') in unserem Skript zugreifen können. In dieser Referenz wird aber lediglich die Adresse des, vom Interpreter im Arbeitsspeicher abgelegten, Objektes gespeichert.
So warum verweisen nun die beiden Referenzen "a" und "b" im ersten Beispiel auf das selbe Objekt und im zweiten nicht. Die Antwort liegt auch hier wieder beim Interpreter. Dieser entscheidet selber ob er ein neues Objekt in den Arbeitsspeicher schreibt oder ob er lediglich ein bestehendes Objekt neu referenziert. Einfache Datentypen wie Integer, Double oder auch Strings werden meistens nur neu referenziert. Für kompliziertere Datentypen wie Listen oder Dictionarys wird meines Wissens nach immer ein neues Objekt angelegt.
Übrigens bin ich hier auch schon über Fehler gestolpert, die ursprünglich auf dieser Thematik basieren. Hier ein kleines Beispiel:
Code: Alles auswählen
a = [1]
b = a
b.append(2)
print('a:', a)
print('b:', b)
print('a is b:', a is b)
Mit "b = a" wird keine Kopie der vorhanden Liste erstellt, sondern nur die die Liste a neu referenziert. Wenn man es darstellen müsste könnte man es "b = a = [1]" schreiben. Was so nicht korrekt wäre, weil man a neu referenzieren kann und "b=[1]" trotzdem noch gültig wäre und nicht das neue Objekt von a referenzieren würde. Faktisch ist dann "b.append(2)" gleich "b = a = [1].append(2)" mit der im Vorsatz beschriebenen Ausnahme. Um eine Kopie des Objektes zu erstellen, muss man die dazugehörige Funktion aufrufen. Erst dann kann man mit einer neuen Liste weiterarbeiten.
Um auch ein Beispiel aus den Lehrbüchern angebracht zu haben:
Viele Lehrbücher tun so als ob man mit der Funktion "del()" das Objekt gelöscht hat. Dem ist aber nicht so, man hat lediglich die Referenz auf das Objekt gelöscht. Das Objekt kann weiterhin im Arbeitsspeicher liegen.
Als keines Beispiel für dieses Verhalten eine Neureferenzierung einer Liste:
Code: Alles auswählen
a = [1, 2, 3]
b = a
print('a is b:', a is b) # True
del(a)
print(b)
Hier sieht man "a" und "b" verweisen auf das selbe Objekt wir löschen mittels "del()" die Referenz "a". Das Objekt verbleibt aber weiterhin im Arbeitsspeicher.
Wer vielleicht schon etwas Python kann und sich mit diesem Thema intensiver auseinander setzen will, dem empfehle ich einen Ausflug in zu C da man sich hier um die Typen der Variablen und deren Speicherung größtenteils selber kümmern muss. Stichwort: Zeiger.
Somit ist "is" und "==" nicht das Gleiche. Mir war der Unterschied zwischen "dasselbe" und "das Gleiche" genauso unbewusst wie so manchem Anweder der Unterschied zwischen "==" und "is".
Wenigstens habe ich diesmal genügend Angriffsfläche in meinen Erörterungen zu Python geboten, so dass wir uns nicht weiter mit den Feinheiten der deutschen Sprache beschäftigen müssen, sondern das tun, was wir hier alle tun wollen. Etwas über Python lernen.