Mutable Python vs Immutable?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Erstmal solltest du unterscheiden zwischen einer Variablen und dem Wert/Objekt, den die Variable referenziert.

Die Variablen selbst sind mutable. Die Objekte dagegen sind es nicht alle. Nur die Listen sind in dem Beispiel mutable die ints dagegen sind immutable, obwohl die Variablen a und b natürlich geändert werden können.

Ob 2 Variablen das selbe Objekt referenzieren kannst du mit "is" testen.

z.B.

l1 = [1,2,3]
l2 = [1,2,3]
print(l1 is l2)

Da kommt False raus, l1 und l2 sind folglich unterschiedliche Objekte.

Bei Zahlen sieht es aber etwas anders aus.

a = 1
b = 1
print(a is b)

Das ergibt True.

a und b referenzieren folglich ein und das selbe Objekt. Es würde ja auch keinen Sinn machen, wenn es mehrere Objekte gäbe, die alle 1 repräsentieren. Eine 1 reicht. Und die ist natürlich immutable, so wie alle Zahlen.

Ich empfehle hier mal einen Blick in die Dokumentation:

https://docs.python.org/3/reference/datamodel.html

Man beachte:

for immutable types, operations that compute new values may actually return a reference to any existing object with the same type and value, while for mutable objects this is not allowed. E.g., aftera = 1; b = 1, a and b may or may not refer to the same object with the value one, depending on the implementation, but after c = []; d =[], c and d are guaranteed to refer to two different, unique, newly created empty lists. (Note that c = d = [] assigns the same object to both c and d.)

int ist immutable.

Und wenn du zwei gleiche Objekte unabhängig voneinander erstellst sind es immer unterschiedliche Instanzen.

(Außer bei Java/Python Strings, da bekommen gleiche Strings die selbe Instanz, keine Ahnung was sich sich bei dem Blödsinn gedacht haben xD)

Mutable und Immutable macht nur dann einen Unterschied, wenn du den Wert kopieren willst:

L1 = [ 1, 2, 3 ]
L2 = L1

-> L2 und L1 verweisen auf das selbe Objekt

a = 1
b = a

-> b erhält nur eine Kopie von a

Hat aber eigentlich nur damit zu tun, ob die Variable nur auf einen Pointer verweist (so ist das bei Objekten wie z.B. Listen), oder ob die Variable direkt auf Daten verweist (so ist das bei primitiven Datentypen wie z.B. Zahlen). Jenachdem übergebe ich beim zuweisen dann nur eine Kopie des Pointers und somit den Verweis auf das selbe Objekt, oder eben eine Kopie der Daten.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Spiderpig42  28.10.2022, 00:28

Bei Python Strings ist das aber auch oft so. Zumindest hat bei mir folgender Code True ergeben:

a = "abc"
b = "abc"
print(a is b)
1
regex9  28.10.2022, 02:16
(Außer bei Java/Python Strings, da bekommen gleiche Strings die selbe Instanz, keine Ahnung was sich sich bei dem Blödsinn gedacht haben xD)

Das gilt (in Java) nur beim Erstellen eines Strings via Literal.

String word = "House";

Intern wird ein Objektpool verwendet. Wenn ein String gleichen Werts bereits im Pool liegt, wird eine Referenz auf dieses Objekt zurückgegeben. Andernfalls wird ein neues Objekt in den Pool geworfen. Dessen Referenz geht an die String-Variable.

Da Strings unveränderlich sind, ist so ein Objektpool sinnvoll. Es erspart Speicherplatz.

Dieser Eingriff wird bei Nutzung des new-Schlüsselworts nicht vorgenommen, da in diesem Zuge zum einen eh neuer Speicherplatz reserviert wird und zum anderen wäre es sprachlich betrachtet ein unerwartetes Verhalten, über new kein eigenständiges Objekt zurückzubekommen.

1