Nun, ich denke, dass die Tatsache, dass sie nicht gleich sind, ziemlich allgegenwärtig ist, Dann möchte ich erklären, was zum Teufel Sie vergleichen.
Es scheint, dass der Artikel immer Fehler enthält. Ich würde mich freuen, wenn Sie darauf hinweisen könnten (ich würde mich freuen, wenn es Feedback gäbe).
Ich werde es kurz erklären (wenn Sie es verstehen, können Sie es überspringen) Schauen Sie sich zuerst Beispiel 1 an
Beispiel 1
a = "Kaninchenhaus"
b = "Kaninchenhaus" #Gleiche Zeichenfolge wie a
c = "Kantoan" #Zeichenfolge anders als a
#a und c==Vergleichen mit
print(a == c) # False
#Vergleiche a und c mit is
print(a is c) # False
#A und B==Vergleichen mit
print(a == b) # True
#Vergleiche a und b mit is
print(a is b) # False
Da "Rabbit House" und "Kantoan" natürlich unterschiedlich sind, sind "a == c" und "a is c" beide "False".
Auf der anderen Seite sehen "a" und "b" auf den ersten Blick gleich aus, aber ...
True
wenn a == b
False
wenn a b
ist
Das Ergebnis ist anders
Nun, das Hauptthema
Ich werde anhand von Beispiel 2 erklären.
Beispiel 2
a = "Kaninchenhaus"
b = "Kaninchenhaus" #Gleiche Zeichenfolge wie a
# ==Vergleichen mit
print(a == b) # True
#Vergleiche mit is
print(a is b) # False
print(id(a)) #Objekt-ID von a
print(id(b)) #Objekt-ID von b(Gibt einen Wert zurück, der nicht mit a identisch ist)
In Python sind alle Daten ein Objekt.
id ()
ist eine Funktion, die die ID des Argumentobjekts zurückgibt (im Folgenden als Objekt-ID bezeichnet).
==
gab True
zurück, weil a
und b
__ dieselbe Zeichenfolge __ waren.
"A is b" wird jedoch "False" zurückgegeben, obwohl es sich um dieselbe Zeichenfolge handelt.
Dies liegt daran, dass is
ein __- Operator ist, der __-Objekt-IDs vergleicht.
Überprüft, ob ==
__äquivalent __ ist.
Auf der anderen Seite prüft is
auf identity.
Der Unterschied ist hier
Es reicht aus, die oben genannten Inhalte zu verstehen, aber es gibt Ausnahmefälle, daher werde ich sie vorerst vorstellen.
Beispiel 3
a = 100
b = 100
print(a == b) #Ist es gleichwertig?
print(a is b) #Ist es das Gleiche
Wird es wahr oder falsch sein?
Diejenigen, die bisher verstehen, sind wahrscheinlich Sie würden erwarten, dass "a == b" "True" zurückgibt und "a is b" "False" zurückgibt.
Aber __ beide sind "wahr" ... __
*** Diese Vergleichsoperatoren sollten verallgemeinert werden, aber es gibt Ausnahmen und sie sind verrückt. *** ***
Ich würde denken. Das dachte ich zuerst (´ ´ ω ・ `)
Dafür gibt es aber einen guten Grund. Aus der Plain Integer Objects - Python 2.7.13-Dokumentation - PyObject * PyInt_FromLong
The current implementation keeps an array of integer objects for all integers between -5 and 256
Auf Japanisch erklären
Die aktuelle Implementierung von Python enthält ein Array von Ganzzahlobjekten von -5 bis 256
Es gibt. Mit anderen Worten, Python speichert Arrays immer von -5 bis 256 im Speicher.
a = b = range(-6, 258) #-Generieren Sie ein Array von 6 bis 257
for x,y zip(a, b):
print(x, x is y) #Vergleichen Sie, ob zwei äquivalente Werte gleich sind
-6 False
-5 True
-4 True
.
.
(Unterlassung)
.
.
255 True
256 True
257 False
Sie haben zwischen -5 und 256 "True" zurückgegeben, da die Objekt-IDs identisch sind. Andererseits gibt es "False" für -6 und 257 (erster und letzter Wert) zurück, die außerhalb des vom Speicher gehaltenen Wertebereichs liegen.
Es ist verwirrend, aber Sie sollten sich auch daran erinnern.
Andere Der Vergleich zwischen "True" und "False" gibt immer "True" zurück. Dies liegt daran, dass immer nur ein "Wahr" und "Falsch" im Speicher ist.
Soweit ich weiß, gibt es eine weitere Ausnahme, die ich hier jedoch weglassen werde.
Wenn Sie Vorschläge haben, hinterlassen Sie diese bitte im Kommentarbereich!
Recommended Posts