[Python] Warum die IDs der referenzierten Objekte gleich sind, wenn verschiedenen Variablen dieselbe Ganzzahl zugewiesen wird

Dies ist eine Frage, auf die ich gestoßen bin, als ich etwas über das Verhalten von Python-Zuweisungen gelernt habe.

Wenn Sie verschiedenen Variablen dieselbe Ganzzahl zuweisen, sind die IDs der referenzierten Objekte identisch. Warum?

Wenn den Variablen a und b 10 zugewiesen ist, wie unten gezeigt,

Python


>>> a = 10
>>> b = 10

In meinen Augen sind diese ↓ "** -Werte beide 10, aber im Speicher werden zwei Objekte mit jeweils a- und b-Namen erstellt. Die ID (Speicheradresse) ist natürlich unterschiedlich. Es war ein Bild von "** zeigt auf **". Es heißt Python-Zuweisung ist bindend / bindend. スクリーンショット 2020-01-18 1.49.53.png

Wenn ich jedoch die ID des Objekts überprüfe, auf das durch die Variablen a und b verwiesen wird,

Python


>>> id(a)
4343178640
>>> id(b)
4343178640
>>>
>>> a is b
True
>>>

#das Gleiche...!?!?!?

Es zeigte genau die gleiche ID. Wie unten gezeigt, beziehen sich ** a und b beide auf dasselbe Objekt **. スクリーンショット 2020-01-18 2.21.00.png Wenn ich "b = a" gesetzt hätte, wäre ich mit diesem Ergebnis zufrieden, aber ich habe b nicht durch a ersetzt.

Gemäß der offiziellen Dokumentation ist bereits vor der Zuweisung ein ganzzahliges Objekt zwischen -5 und 256 im Speicher vorhanden.

Ich habe nach "python variable int id same" gesucht und es ist nicht aufgetaucht. Deshalb habe ich bei Google US nach "python int same address" gesucht und es wurde behoben.

Python WAT !? Integer Cache → [Integer Objects (offizielles Dokument)](https://docs.python.org/3/c- api / long.html # c.PyLong_FromLong)

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. Die aktuelle Implementierung versucht, ein Array von Ganzzahlobjekten für alle Ganzzahlen von -5 bis 256 beizubehalten, und das Generieren einer Zahl in diesem Bereich gibt tatsächlich einen Verweis auf ein vorhandenes Objekt zurück. ..

Das ist der Grund

"Die ganzen Zahlen von -5 bis 256 können im Speicher verwendet werden. Wenn also die Zuweisung von" a = 10 "" b = 10 "durchgeführt wird, befinden sich beide Variablen a und b bereits im Speicher. Beziehen Sie sich einfach auf das obige Ganzzahlobjekt "10", und das Ergebnis ist dieselbe ID. "

Wenn Sie es mit Werten von 256, 257 versuchen, was die Grenze zwischen erweitertem und nicht erweitertem Speicher darstellt,

Python


>>> a = 256
>>> b = 256
>>> id(a)
4343186512
>>> id(b)
4343186512 #ID ist die gleiche
>>> a is b
True
>>>
>>> a = 257
>>> b = 257
>>> id(a)
4346386992
>>> id(b)
4346387088 #ID ist anders! !!
>>> a is b
False
>>>

Wie aus der offiziellen Dokumentation zu erwarten ist, können wir aus 257 ersehen, dass die Objekte, auf die durch Variable a und Variable b verwiesen wird, unterschiedlich sind.

Wenn Sie die folgende Site lesen, besteht der Zweck darin, "häufig Zahlen von -5 bis 256 zu verwenden und sie sofort für die Leistung verfügbar zu machen". Real Python: Small Integer Caching

Experimentieren Sie mit Gleitkommazahlen anstelle von ganzen Zahlen

Mir wurde gesagt "Ich versuche ein Array von ** ganzzahligen Objekten ** ~ zu behalten", also habe ich es mit Gleitkommazahlen versucht ...

Python


>>> a = 0.5
>>> b = 0.5
>>> id(a)
4317942456
>>> id(b)
4317941880 #ID ist anders
>>> a is b
False
>>>

Das Ergebnis ist, dass die Werte selbst gleich sind, die IDs für Gleitkommazahlen jedoch unterschiedlich sind. Ich konnte bestätigen, dass dies auch nur ganze Zahlen sind, wie dokumentiert.

Versuchte Umgebung

Python 3.7.1

Recommended Posts

[Python] Warum die IDs der referenzierten Objekte gleich sind, wenn verschiedenen Variablen dieselbe Ganzzahl zugewiesen wird
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Wenn Selenium sagt, dass die Chrome-Treiberversion anders ist (Python)
python So benachrichtigen Sie automatisch per Telefon, wenn das System ausfällt
Entspricht die Zahl einer Ganzzahl?
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Warum muss Python einen Doppelpunkt schreiben?
Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.
[Einführung in Python] Was ist das wichtige "if __name__ == '__ main__':" beim Umgang mit Modulen?