[Python] Warum unveränderliche Haze-Int-Typen in andere Werte geändert werden können

Fazit zuerst

Wenn Sie einer Variablen vom Typ int einen anderen Wert zuweisen, ändert sich der Speicherort. Mit anderen Worten, der Wert der Variablen vom Typ int kann nicht geändert werden, wenn dieselbe Adresse verwendet wird. (Umgekehrt kann eine veränderbare Liste das tun)

Grund für das Schreiben des Artikels

Es gibt bereits viele Artikel, die sich mit dem Verhalten von veränderlich / unveränderlich befassen. Wenn ein Python-Anfänger jedoch nach einer Frage wie diesem Artikel sucht, dachte ich, dass es so aussieht, als ob "Python int unveränderlich geändert werden kann", und habe es so erstellt, dass ich die gewünschten Informationen mit dieser Suchmethode finden kann.

Was ist veränderlich / unveränderlich?

(Es gibt viele leicht verständliche Artikel für detaillierte Beschreibungen. Bitte beziehen Sie sich auf diese.)

--mutable: Typen, deren Werte nach der Variablendefinition geändert werden können (Liste, Diktat usw.)

Frage

Es wird gesagt, dass es nicht geändert werden kann, aber Sie können es neu zuweisen, nachdem Sie sowohl int als auch str definiert haben!

#Einmal definieren
var_int = 2
#Sie können es neu zuweisen!
var_int = 5

Was passiert eigentlich?

Verwenden Sie die in Python installierte ID-Funktion, um die ID (Adresse) der Variablen zu überprüfen. Verwendungsumgebung: Python 3.8.3, Jupyter Notebook

#Ersetzen Sie die Variable a durch den int-Typ Nummer 3
a = 3
# id()Holen Sie sich die Adresse der Variablen a using
id(a)
# out: 4500765184

Wie Sie sehen können, lautet die ID der Variablen a 4500765184. Als nächstes ändern wir den Wert.

#Ersetzen Sie die Variable a durch den Int-Typ Nummer 2
a = 2 #Du kannst es ändern!
# id()Holen Sie sich die Adresse der Variablen a using
id(a)
# out: 4500765216
#Wenn Sie denken, hat sich die ID geändert!

Auf diese Weise können Sie den Wert derselben Variablen auf den ersten Blick ändern, sodass sie anscheinend nicht unveränderlich ist. Wenn Sie jedoch die ID überprüfen, können Sie feststellen, dass die ID auch mit demselben Variablennamen geändert wurde.

Mit anderen Worten, wenn Sie den int-Wert demselben Variablennamen zuweisen, wird er in der neuen Adresse gespeichert! Da der Wert der ursprünglichen Adresse nicht geändert werden kann, ist er unveränderlich.

Ein bisschen tiefer über id

(Für diejenigen, die interessiert sind, weil ich bereits fertig bin, was ich im Artikel vermitteln möchte) Wenn Sie [Dokumente zur Python-ID] überprüfen (https://docs.python.org/3/library/functions.html#id),

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

Ist geschrieben. Insbesondere im Fall von CPython wird geschrieben, dass es eine Speicheradresse darstellt.

Der größte Teil des Python, das wir jetzt verwenden, basiert auf der Implementierung namens CPython. Sie können sich also die ID als Speicheradresse vorstellen.

Erstens ist ein Objekt wie eine Box, die Variablen enthält. Alternativ kann es einfacher sein, die Adresse zu verstehen, unter der die Variable gespeichert ist. Da das Programm auf einem Computer ausgeführt wird, sind "welcher Wert" und "wo zu merken" erforderlich. Das Objekt wird als eine Gruppe davon betrachtet.

Wenn Sie den Wert dann einer unveränderlichen Variablen neu zuweisen, wird ein anderes Objekt erstellt. Mit anderen Worten wird eine andere Adresse gesichert und ein neuer Wert gespeichert.

Am Ende

Ich erinnerte mich an die Fragen, die ich als Anfänger hatte, und fasste sie zusammen. Um ehrlich zu sein, ist es möglicherweise selten, sich um den Speicherort von Variablen in Python zu kümmern, aber ich hoffe, dass dies zur Lösung der Frage beiträgt. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie mich unterrichten könnten!

Recommended Posts

[Python] Warum unveränderliche Haze-Int-Typen in andere Werte geändert werden können
Stellen Sie sicher, dass Python eine Zeichenfolge in int konvertieren / konvertieren kann
Nur Arrays der Größe 1 können in Python-Skalare konvertiert werden
Unveränderlicher Python-Typ int memo
Neue Funktionen in Python 3.9 (1) - Der Summensatzoperator kann im Wörterbuchtyp verwendet werden.
[Python] So tauschen Sie Array-Werte aus
[Raspberry Pi] Python wurde standardmäßig in Python3 geändert