7.3 Mutable vs. immutable Datentypen 

Vielleicht sind Sie beim Ausprobieren des gerade Beschriebenen schon auf den folgenden Scheinwiderspruch gestoßen:
>>> a = 1
>>> b = 1
>>> id(a)
9656320
>>> id(b)
9656320
>>> a is b
TrueWarum referenzieren a und b dieselbe Ganzzahl-Instanz, wie es der Identitätenvergleich zeigt, obwohl wir in den ersten beiden Zeilen ausdrücklich zwei Instanzen mit dem Wert 1 erzeugt haben?
Um diese Frage zu beantworten, müssen wir wissen, das Python grundlegend zwischen zwei Arten von Datentypen unterscheidet: zwischen mutable (dt. veränderlichen) Datentypen und immutable (dt. unveränderlichen) Datentypen. Wie die Namen schon sagen, besteht der Unterschied zwischen den beiden Arten darin, ob sich der Wert einer Instanz zur Laufzeit ändern kann, ob sie also veränderbar ist. Instanzen eines mutable Typs sind dazu in der Lage, nach ihrer Erzeugung andere Werte anzunehmen, während dies bei immutable Datentypen nicht der Fall ist.
Wenn sich der Wert einer Instanz aber nicht ändern kann, macht es auch keinen Sinn, mehrere immutable Instanzen des gleichen Werts im Speicher zu verwalten, weil im Optimalfall genau eine Instanz ausreicht, auf die dann alle entsprechenden Referenzen verweisen. Wie Sie sich nun sicherlich denken, handelt es sich bei Ganzzahlen eben um so einen immutable Datentyp, und Python hat aus Optimierungsgründen bei beiden Einsen auf dieselbe Instanz verweisen lassen. Auch Strings sind immutable. [Das bedeutet natürlich nicht, dass Strings und Ganzzahlen aus Sicht des Programmierers unveränderlich sind. Es wird nur bei jeder Manipulation eines immutable Datentyps eine neue Instanz des Datentyps erzeugt, anstatt die alte zu verändern. ]
Es ist allerdings nicht so, dass es immer nur genau eine Instanz zu jedem benötigten Wert eines unveränderlichen Datentyps gibt, obwohl dies theoretisch möglich wäre. Der Grund dafür liegt in der Optimierung:
Wird eine neue Instanz eines immutable Typs vom Programm angefordert, gibt es für Python zwei Möglichkeiten. Entweder wird eine neue Instanz im Speicher erstellt oder eine vorhandene ein weiteres Mal referenziert. Eine neue Instanz im Speicher zu erzeugen »kostet« Python Rechenzeit und Speicherplatz. Python muss Speicher anfordern und diesen mit den entsprechenden Informationen füllen. Eine bestehende Instanz ein weiteres Mal zu referenzieren ist um ein Vielfaches »billiger«, da sowohl das Bereitstellen als auch das Befüllen des Speichers entfallen und stattdessen nur ein Referenzzähler erhöht sowie eine Speicheradresse kopiert werden muss. Das stimmt aber nur dann, wenn der Interpreter schon weiß, an welcher Stelle im Speicher eine Instanz mit dem gleichen Wert wie der neu angeforderten Instanz liegt. Je »länger« der Wert der neuen Instanz ist und je mehr Instanzen es bereits gibt, desto aufwendiger gestaltet sich die Suche nach einer bereits bestehenden passenden Instanz. Ab einem gewissen Punkt ist es dann nicht mehr effizient, eine bereits existierende Instanz erneut zu referenzieren, weil die Suche mehr Rechenzeit kostet als das Erstellen einer neuen Instanz. Python entscheidet unabhängig vom Programmierer, welchen der beiden Wege es beschreitet. Beispielsweise haben wir im letzten Abschnitt die Arbeitsweise von id mit dem String "Hallo Welt" verdeutlicht und festgestellt, dass sich die Identitäten der beiden Instanzen unterscheiden: Python hat in diesem Fall aus den oben genannten Optimierungsgründen zwei Instanzen des Strings erstellt, obwohl dies nicht nötig gewesen wäre.
Bei den mutable, also den veränderlichen Datentypen sieht es anders aus: Weil Python damit rechnen muss, dass sich der Wert einer solchen Instanz nachträglich ändern wird, ist das obige System, nach Möglichkeit bereits vorhandene Instanzen erneut zu referenzieren, nicht sinnvoll. Hier kann man sich also darauf verlassen, dass immer eine neue Instanz erzeugt wird.
Weil wir bisher noch keinen veränderbaren Datentyp eingeführt haben, muss an dieser Stelle auf ein Beispiel verzichtet werden.
Wir werden im Folgenden bei der Einführung neuer Datentypen angeben, zu welcher der beiden Kategorien sie gehören.




bestellen





