Dies ist eine Frage, auf die ich gestoßen bin, als ich etwas über das Verhalten von Python-Zuweisungen gelernt habe.
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.
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 **. Wenn ich "b = a" gesetzt hätte, wäre ich mit diesem Ergebnis zufrieden, aber ich habe b nicht durch a ersetzt.
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
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.
Python 3.7.1
Recommended Posts