[PYTHON] FAQ: Warum ist der Zahlenvergleich inkonsistent?

>>> x = 100
>>> y = 100
>>> x == y
True
>>> x is y
True
>>> x = 1000
>>> y = 1000
>>> x == y
True
>>> x is y
False

Dies ist nicht der gleiche Wert, sondern der gleiche Vergleich

Der Operator is vergleicht, ob der linke und der rechte Verweis auf dasselbe Objekt verweisen. Siehe folgendes Beispiel.

>>> x = []
>>> y = []
>>> x is y
False
>>> z = x
>>> x is z
True
>>> x.append(42)
>>> y
[]
>>> z
[42]

x und y sind separate Listenobjekte, die separat erstellt werden. X ist also y ist falsch, und das Ändern von x wirkt sich nicht auf y aus.

Andererseits bezieht sich z auf dasselbe Objekt wie x. X ist also z ist wahr, und das Ändern von x (das Listenobjekt, auf das verwiesen wird) ändert natürlich auch z.

Der Integer-Typ ist unveränderlich

Ein Objekt, dessen Wert das Objekt angibt, wird beim Erstellen des Objekts bestimmt und ändert sich danach nicht mehr. Es wird als unveränderlich bezeichnet. Die ganze Zahl ist unveränderlich. Siehe den folgenden Beispielcode.

>>> x = 42
>>> y = x
>>> x is y
True
>>> x += 1
>>> x
43
>>> y
42
>>> x is y
False

Unmittelbar nach "y = x" war "x ist y" wahr, weil x und y auf dasselbe Objekt zeigen, das 42 darstellt. x + = 1 weist x ein anderes Objekt zu, das 43 darstellt. Also wird "x ist y" falsch.

Fliegengewichtsmuster

Das Flyweight-Muster wird zur Optimierung verwendet, wenn unveränderliche Objekte wie ganzzahlige Typen in großer Anzahl verwendet werden. Indem Sie ein vorhandenes Objekt freigeben, anstatt jedes Mal ein Objekt mit diesem Wert zu erstellen, wenn ein neuer Wert benötigt wird

Es gibt Verdienste wie.

(Stand 07.09.2016) In CPython werden Ganzzahlen von -5 bis 256 vom Flyweight-Muster verwaltet, und es wird immer dasselbe Objekt verwendet. Wenn der Wert in diesem Bereich liegt, kann "x ist y" auch für Objekte wahr sein, die separat erstellt werden sollten.

Recommended Posts

FAQ: Warum ist der Zahlenvergleich inkonsistent?
Warum ist das erste Argument der [Python] -Klasse selbst?
Gründe für die Verwendung der Hybridverschlüsselung (Vergleich der Verschlüsselungs- / Entschlüsselungsgeschwindigkeiten)
Gibt es ein Geheimnis in der Häufigkeit der Umfangszahlen?
Ist die Lotterie rentabel? ~ LOTO7 und das Gesetz der großen Zahlen ~
Ist die Niederschlagswahrscheinlichkeit korrekt?
Wissenschaft "Ist Saito der Vertreter von Saito?"
Wenn die Genauigkeit des PCR-Tests schlecht ist, warum nicht den Test wiederholen?
Was ist die Ursache für den folgenden Fehler?
[Python] [Meta] Ist der Python-Typ ein Typ?
Warum wird Kreuzentropie für die Zielfunktion des Klassifizierungsproblems verwendet?
Tipps: Vergleich der Größe von drei Werten
Der hintere Schrägstrich der japanischen Tastatur ist "ro".
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Der Ursprung von Manjaro Linux ist "Mount Kirimanjaro"
Der Wert von pyTorch torch.var () wird nicht verteilt
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Scraping der Gewinndaten von Zahlen mit Docker
Ich dachte darüber nach, warum Python selbst mit dem Gefühl eines Python-Interpreters notwendig ist
Um den Ort, an dem der Wert von Errbot gespeichert ist
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Was ist ein empfohlener Motor? Zusammenfassung der Typen
Wenn Sie das Update von ManjaroLinux für seltsam halten
Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy