Wenn Sie aus einer anderen Sprache zu Python kommen (außer einer, die Python sehr ähnlich ist, wie Ruby) und darauf bestehen, es in Bezug auf diese andere Sprache zu verstehen, sind die Leute hier normalerweise verwirrt:
>>> a = 1
>>> a = 2 # I thought int was immutable, but I just changed it?!
In Python ist die Zuweisung in Python keine Mutation.
Wenn Sie in C ++ schreiben a = 2
, rufen Sie auf a.operator=(2)
, wodurch das in gespeicherte Objekt mutiert wird a
. (Und wenn es war kein Objekt gespeichert a
, dass ein Fehler ist.)
Tut in Python a = 2
nichts mit dem, was in gespeichert wurde a
; es bedeutet nur, dass 2
jetzt in gespeichert a
wird. (Und wenn es ist kein Objekt gespeichert ina
, ist das in Ordnung.)
Letztendlich ist dies Teil einer noch tieferen Unterscheidung.
Eine Variable in einer Sprache wie C ++ ist ein typisierter Speicherort im Speicher. Wenn dies a
ein int
ist, bedeutet dies, dass es 4 Bytes sind, von denen der Compiler weiß, dass sie als interpretiert werden sollen int
. Also, wenn Sie das tun a = 2
, ändert es , was in diesen 4 Byte Speicher gespeichert wird aus 0, 0, 0, 1
zu 0, 0, 0, 2
. Wenn es irgendwo anders eine andere int-Variable gibt, hat sie ihre eigenen 4 Bytes.
Eine Variable in einer Sprache wie Python ist ein Name für ein Objekt, das ein Eigenleben hat. Es gibt ein Objekt für die Nummer 1
und ein anderes Objekt für die Nummer 2
. Und a
sind nicht 4 Bytes Speicher, die als dargestellt werden int
, sondern nur ein Name, der auf das 1
Objekt zeigt. Es macht keinen Sinn a = 2
, die Nummer 1 in die Nummer 2 zu verwandeln (das würde jedem Python-Programmierer zu viel Macht geben, um die grundlegenden Funktionen des Universums zu ändern). Stattdessen a
vergessen Sie einfach das 1
Objekt und zeigen auf das2
stattdessen Objekt.
Also, wenn Zuweisung keine Mutation ist, was ist es dann ? eine Mutation?
- Aufrufen einer Methode, deren Mutation dokumentiert ist, wie z
a.append(b)
. (Beachten Sie, dass diese Methoden fast immer zurückkehren None
). Unveränderliche Typen haben keine solchen Methoden, veränderbare Typen normalerweise.
- Zuweisen zu einem Teil des Objekts, wie
a.spam = b
odera[0] = b
. Unveränderliche Typen erlauben keine Zuordnung zu Attributen oder Elementen, veränderbare Typen erlauben normalerweise das eine oder andere.
- Manchmal mit erweiterter Zuordnung
a += b
, manchmal nicht. Veränderbare Typen mutieren normalerweise den Wert; Unveränderliche Typen tun dies niemals und geben Ihnen stattdessen eine Kopie (sie berechnen a + b
und weisen das Ergebnis dann zu a
).
Aber wenn Zuweisung keine Mutation ist, wie ist die Zuweisung zu einem Teil der Objektmutation? Dort wird es schwierig. a[0] = b
ist nicht mutieren a[0]
(auch hier im Gegensatz zu C ++), aber es tut mutierena
( im Gegensatz zu C ++, mit Ausnahme indirekt).
All dies ist der Grund, warum es wahrscheinlich besser ist, nicht zu versuchen, Pythons Semantik in eine Sprache zu bringen, die Sie gewohnt sind, sondern stattdessen Pythons Semantik nach ihren eigenen Begriffen zu lernen.