Gibt es einen Unterschied zwischen "==" und "ist"?
Meine Google-fu hat mich im Stich gelassen.
In Python, sind die folgenden zwei tests für Gleichheit äquivalent?
n = 5
# Test one.
if n == 5:
print 'Yay!'
# Test two.
if n is 5:
print 'Yay!'
Trifft dies auch für die Objekte, wo Sie wäre zum vergleichen von Instanzen (eine list
sagen)?
Okay, also diese Art von Antworten meine Frage:
L = []
L.append(1)
if L == [1]:
print 'Yay!'
# Holds true, but...
if L is [1]:
print 'Yay!'
# Doesn't.
So ==
tests Wert, wo is
tests, um zu sehen, wenn Sie das gleiche Objekt?
InformationsquelleAutor Bernard | 2008-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
is
zurückTrue
wenn zwei Variablen auf das gleiche Objekt zeigen,==
wenn die Objekte bezeichnet, die von der Variablen gleich sind.In Ihrem Fall, der zweite test nur funktioniert, weil Python caches kleinen integer-Objekte, die eine Implementierung detail. Für größere zahlen, das nicht funktioniert:
Das gleiche gilt für string-Literale:
Finden Sie diese Frage als gut.
echo 'import sys;tt=sys.argv[1];print(tt is "foo", tt == "foo", id(tt)==id("foo"))'| python3 - foo
Ausgabe:False True False
.Sie verloren mich mit der
b = a[:]
slice-operator Liste kopieren Teil, also ich habe bearbeitet Ihre Antwort auf einen Kommentar gibt. Sieht aus wie ich nur den Schwellenwert erreicht, um nicht zu haben, meine änderungen geprüft, bevor Sie Sie anwenden, so dass hoffentlich das ist cool mit Sie. Egal, hier ist eine nützliche Referenz für die, wie kopieren, Listen, stieß ich auf und musste Verweis, um herauszufinden, was Sie tun: stackoverflow.com/a/2612815/4561887InformationsquelleAutor Torsten Marek
Gibt es eine einfache Faustregel, um zu sagen, Wann Sie zu verwenden
==
oderis
.==
ist für Wert der Gleichheit. Verwenden Sie es, wenn Sie wissen möchten, ob zwei Objekte den gleichen Wert haben.is
ist für Referenz-Gleichheit. Verwenden Sie es, wenn Sie wissen möchten, ob zwei Referenzen auf das gleiche Objekt beziehen.Im Allgemeinen, wenn Sie vergleichen etwas auf eine einfache Art, Sie sind in der Regel die Prüfung für Wert der Gleichheit, so dass Sie verwenden sollten
==
. Zum Beispiel, die Absicht, Ihr Beispiel ist wahrscheinlich, um zu überprüfen, ob x einen Wert hat, der gleich 2 (==
), nicht, obx
ist buchstäblich verweisen auf das gleiche Objekt wie 2.Etwas anderes zu beachten: aufgrund der Art und Weise der Referenz CPython-Implementierung funktioniert, erhalten Sie unerwartete und inkonsistente Ergebnisse, wenn Sie Sie versehentlich benutzen
is
vergleichen für Referenz-Gleichheit auf ganzen zahlen:Das ist ziemlich viel, was wir erwartet hatten:
a
undb
haben den gleichen Wert, aber unterschiedliche Entitäten. Aber was ist das?Dies ist unvereinbar mit dem früheren Ergebnis. Was ist denn hier Los? Es stellt sich heraus, die Referenz-Implementierung von Python caches integer-Objekte im Bereich -5..256 als singleton-Instanzen für performance-Gründen. Hier ist ein Beispiel verdeutlicht dies:
Dies ist ein weiterer offensichtlicher Grund, nicht zu verwenden
is
: das Verhalten ist von Links bis zu Implementierungen, wenn Sie fälschlicherweise mit es für den Wert der Gleichheit.a=500
undb=500
, wollte nur darauf hinweisen, dass man wenn mana
undb
zu einem interger zwischen [-5, 256],a is b
tatsächlich gibtTrue
. Mehr Informationen finden Sie hier: stackoverflow.com/q/306313/7571052ja, beachten Sie, dass ich schrieb "Es stellt sich heraus, die Referenz-Implementierung von Python caches integer-Objekte im Bereich -5..256 als singleton-Instanzen für performance-Gründen."
Wollte nur mal der link zu der anderen Frage, kein Schaden soll 🙂
InformationsquelleAutor John Feminella
==
bestimmt, wenn die Werte gleich sind, währendis
bestimmt, wenn Sie die exakt gleichen Objekt und gleichen.InformationsquelleAutor stephenbayer
Ja, Sie haben einen sehr wichtigen Unterschied.
==
: Prüfung auf Gleichheit der Semantik, äquivalente Objekte (das sind nicht unbedingt das gleiche Objekt) zu testen, wird als gleich. Als die die Dokumentation sagt:is
: überprüfen der Identität - die Semantik ist, dass das Objekt (wie im Speicher) ist das Objekt. Wieder, die die Dokumentation sagt:So, die Prüfung auf Identität ist die gleiche wie die überprüfung für die Gleichheit der IDs der Objekte. Das ist,
ist das gleiche wie:
wo
id
ist die eingebaute Funktion, die eine Ganzzahl zurückgibt, die "garantiert einzigartig unter den gleichzeitig vorhandenen Objekte" (siehehelp(id)
) und woa
undb
sind beliebige Objekte.Andere Nutzung Richtungen
Verwenden Sie diese Vergleiche für Ihre Semantik. Verwenden
is
zu überprüfen, Identität und==
zu überprüfen Gleichheit.PEP 8, die offizielle Python style guide für die standard-Bibliothek auch erwähnt zwei use-cases für
:
Herleitung der Gleichheit aus der Identität
Wenn
is
wahr ist, kann die Gleichheit in der Regel abgeleitet werden - logisch, wenn ein Objekt selbst ist, dann sollte es test als gleichwertig zu sich selbst.In den meisten Fällen ist diese Logik wahr, aber es stützt sich auf die Umsetzung der
__eq__
spezielle Methode. Als die docs sagen,sind und im Interesse der Einheitlichkeit empfiehlt:
Können wir sehen, dass dies ist das Standardverhalten für benutzerdefinierte Objekte:
Den contrapositive ist in der Regel auch wahr - wenn überhaupt etwas-test als nicht gleich, Sie können in der Regel ableiten, dass Sie nicht das gleiche Objekt.
Da tests für Gleichheit können angepasst werden, diese Annahme nicht immer zutrifft, für alle Typen.
Eine Ausnahme
Eine Bemerkenswerte Ausnahme ist die
nan
- es ist immer tests, die nicht gleich als an sich selbst:Überprüfung auf Identität kann viel schneller überprüfen, als die überprüfung der Gleichheit (die möglicherweise erfordern rekursiv überprüfung der Mitglieder).
Aber es kann nicht ersetzt werden, für Gleichheit, wo können Sie mehr als ein Objekt als gleichwertig.
Beachten Sie, dass der Vergleich der Gleichheit von Listen und Tupeln wird davon ausgegangen, dass die Identität der Objekte gleich sind (denn dies ist ein schneller check). Dies kann zu Widersprüchen, wenn die Logik inkonsistent ist - wie für
nan
:Ein Warnendes Beispiel:
Die Frage ist der Versuch, mit
is
zu vergleichen ganze zahlen. Sie sollten nicht davon ausgehen, dass eine Instanz für ein integer ist, der gleichen Instanz, da man die durch eine andere Referenz. Diese Geschichte erklärt, warum.Kommentator hatte code, stützte sich auf die Tatsache, dass kleine Ganzzahlen (-5 bis 256) sind singletons in Python, anstelle der überprüfung auf Gleichheit.
Er arbeitete in der Entwicklung. Kann es vergangen einige unittests.
Und es hat in der Produktion -, bis der code aktiviert, der für eine ganze Zahl größer als 256 ist, an welcher Stelle es gescheitert in der Produktion.
Dies ist ein Produktion Fehler sein könnte gefangen wurden, im code-review oder möglicherweise eine Stil-checker.
Lassen Sie mich betonen: verwenden Sie nicht
zum vergleichen von ganzen zahlen.
InformationsquelleAutor Aaron Hall
Sind Sie ganz anders.
is
Prüfungen für die Objekt-Identität, während==
prüft auf Gleichheit (ein Begriff, hängt von den beiden Operanden-Typen).Es ist nur einem glücklichen Zufall, dass "
is
" scheint, um korrekt zu arbeiten mit kleinen ganzen zahlen (z.B. 5 == 4+1). Das ist, weil CPython optimiert die Speicherung von ganzen zahlen im Bereich (-5 bis 256), indem Sie diese singletons. Dieses Verhalten ist völlig von der Implementierung abhängig und kann nicht garantiert werden, erhalten unter allerlei kleinere transformativen Operationen.Beispielsweise Python 3.5 macht auch kurze strings, die singletons, aber schneiden Sie stört dieses Verhalten:
InformationsquelleAutor Dan Lenski
Was ist der Unterschied zwischen
is
und==
?==
undis
sind verschiedene Vergleich! Wie andere schon sagten:==
vergleicht die Werte der Objekte.is
vergleicht die Referenzen der Objekte.In Python Namen beziehen sich auf Objekte, zum Beispiel in diesem Fall
value1
undvalue2
beziehen sich auf eineint
Instanz speichern der Werte1000
:Weil
value2
bezieht sich auf das gleiche Objektis
und==
gebenTrue
:Im folgenden Beispiel werden die Namen
value1
undvalue2
beziehen sich auf verschiedeneint
Instanzen, auch wenn beide Speicher die gleichen integer:Weil Sie den gleichen Wert (integer) gespeichert ist
==
wirdTrue
, das ist, warum es oft als "Vergleichswert". Allerdingsis
zurückFalse
denn diese sind verschiedene Objekte:, Wann welcher zu benutzen?
In der Regel
is
ist ein sehr schneller Vergleich. Das ist, warum CPython-caches (oder vielleicht wiederverwendet wäre der bessere Begriff) bestimmte Objekte wie kleine ganze zahlen, Zeichenfolgen usw. Dies sollte aber behandelt werden, als detail könnte (wenn auch unwahrscheinlich) ändern, jederzeit, ohne Warnung.Sollten Sie verwenden Sie nur
is
wenn Sie:vergleichen wollen, einen Wert zu einer Python Konstante. Die Konstanten in Python sind:
None
True
1False
1NotImplemented
Ellipsis
__debug__
int is int
oderint is float
)np.ma.maskierte
aus dem NumPy-Modul)In jedem anderen Fall sollten Sie
==
zu prüfen, für die Gleichheit.Kann ich das Verhalten anpassen?
Gibt es einige Aspekte zu
==
, die noch nicht erwähnt wurden bereits in den anderen Antworten: Es ist ein Teil von Pythons "Datenmodell". Das bedeutet, dass das Verhalten angepasst werden kann mit der__eq__
Methode. Zum Beispiel:Dies ist nur ein künstliches Beispiel, um zu illustrieren, dass die Methode wirklich aufgerufen:
Beachten Sie, dass standardmäßig (wenn keine andere Umsetzung
__eq__
gefunden werden kann in der Klasse oder der Oberklassen)__eq__
verwendetis
:Also ist es eigentlich wichtig, zu implementieren
__eq__
wenn Sie wollen "mehr" als nur Referenz-Vergleich für benutzerdefinierte Klassen!Auf der anderen Seite können Sie nicht anpassen
is
überprüft. Es wird immer vergleichen nur wenn Sie den gleichen Verweis.Werden diese Vergleiche immer wieder ein boolean?
Weil
__eq__
werden können, neu implementiert oder überschrieben, es beschränkt sich nicht zurückTrue
oderFalse
. Es könnte etwas zurückzugeben (aber in den meisten Fällen sollte es ein boolean zurückgibt!).Beispielsweise mit NumPy-arrays die
==
wird ein array zurückgeben:Aber
is
prüft immer wiederTrue
oderFalse
!1 Als Aaron Hall erwähnt in den Kommentaren:
Generell sollte man nicht jede
is True
oderis False
Prüfungen, weil man in der Regel nutzt diese "Kontrollen" in einem Kontext, der implizit konvertiert die Zustand auf einen booleschen Wert (zum Beispiel in einemif
- Anweisung). Damit dieis True
Vergleich und die implizite boolean cast ist mehr Arbeit als einfach nur tun, der boolean cast - und Sie beschränken sich auf Boolesche Werte (das ist nicht als pythonic).Wie PEP8 erwähnt:
is
- Namen, zeigen Sie auf Boolesche Werte geprüft werden soll mit einem booleschen Kontext, wieif __debug__:
oderif not __debug__:
. Die Sie nie tun solltenif __debug__ is True:
oderif __debug__ == True:
- weitere Konstante ist lediglich eine Konstante semantische Wert, kein singleton ist, wird daher die überprüfung mitis
in diesem Fall ist nicht semantisch korrekt. Ich fordere Sie auf, eine Quelle finden, um Ihre Behauptungen zu unterstützen - ich glaube nicht, dass Sie eins finden.Was macht Sie denken, dass die Konstanten nicht singletons? Beachten Sie, dass nur
None
,True
,False
und__debug__
sind, was Sie nennen würde, "Konstante semantische Wert", denn Sie können nicht neu zugewiesen werden. Aber alle von Ihnen sind singletons.Lesen Sie PEP 8 - Strg-F und suchen Sie nach dem Wort "schlechter". - Wenn Sie unittesting, die Sie verwenden würden, selbst.assertTrue
In einigen Fällen, die Sie wirklich brauchen, die
is True
oderif False
überprüfen (aber ja, diese sind ziemlich selten, aber wenn Sie tun, Sie Sie kann machen Sie mitis
). Deshalb auch CPython benutzt Sie manchmal (zum Beispiel hier oder hier)InformationsquelleAutor MSeifert
https://docs.python.org/library/stdtypes.html#comparisons
is
tests für Identität==
tests für GleichheitJede (kleine) Ganzzahl Wert wird auf einen einzelnen Wert abgebildet, so dass alle 3 identisch und gleich. Dies ist eine Implementierung detail, nicht Teil der Sprache spec obwohl
InformationsquelleAutor mmaibaum
Ihre Antwort richtig ist. Die
is
operator vergleicht die Identität zweier Objekte. Die==
operator vergleicht die Werte der beiden Objekte.Ein-Objekt-Identität, die sich nie ändert, sobald es erstellt wurde; Sie können denken, es als das Objekt Adresse im Speicher.
Können Sie Steuern, Vergleich Verhalten von Objekt-Werte durch die Definition einer
__cmp__
Methode oder ein Reich-Vergleich Methode wie__eq__
.InformationsquelleAutor Dave Webb
Haben Sie einen Blick auf Stack Overflow Frage Python ' s "ist" - operator verhält sich unerwartet mit Ganzzahlen.
Was es meistens hinausläuft ist, dass "
is
" überprüft, um zu sehen, wenn Sie das gleiche Objekt, nicht nur einander gleich (die zahlen unter 256 sind ein besonderer Fall).InformationsquelleAutor cobbal
Den
==
operator vergleicht die Werte der beiden Operanden und prüft auf Wert-Gleichheit. In der Erwägung, dassis
- operator prüft, ob die beiden Operanden auf das gleiche Objekt beziehen oder nicht.Aber wenn wir das tun
Grundsätzlich
is
gedacht werden kann als Kurzformel fürid(a) == id(b)
. Aber darüber Hinaus gibt es Macken des run-time-Umgebung, die weiter die Dinge zu komplizieren. Kurze strings und kleine Ganzzahlen zurückTrue
, wenn im Vergleich mitis
aufgrund der Python-Maschine, versuchen Sie es mit weniger Speicher für identische Objekte.InformationsquelleAutor iNet
Als John Feminella sagte, die meisten der Zeit, die Sie verwenden werden, = = und != denn Ihr Ziel ist es, Werte zu vergleichen. Ich möchte nur, um zu kategorisieren, was Sie tun würde, den rest der Zeit:
Gibt es eine und nur eine Instanz von NoneType d.h. None ist ein singleton. Folglich
foo == None
undfoo is None
das gleiche bedeuten. Aber dieis
test ist schneller und die Pythonic Konvention ist die Verwendungfoo is None
.Wenn Sie dabei einige Introspektion oder ausmisten über mit garbage collection oder überprüfen, ob Ihr custom-built string Praktikum gadget funktioniert oder dergleichen, dann haben Sie wahrscheinlich ein Fall für
foo
istbar
.True und False sind auch (jetzt) singletons, aber es gibt keinen use-case für
foo == True
und keine Verwendung fürfoo is True
.InformationsquelleAutor John Machin
Meisten von Ihnen schon beantwortet auf den Punkt. Nur als zusätzliche Anmerkung (basierend auf meinem Verständnis und zu Experimentieren, aber nicht aus einer Quelle dokumentiert), wird die Anweisung
oben Antworten sollte gelesen werden als
. Ich kam zu dieser Schlussfolgerung auf der Grundlage der unter test:
Hier der Inhalt der Liste und Tupel sind gleich, aber der Typ/Klasse unterschiedlich sind.
InformationsquelleAutor Sandeep
In einer nussschale,
is
prüft, ob zwei Referenzen auf das gleiche Objekt zeigen oder nicht.==
prüft, ob zwei Objekte den gleichen Wert haben oder nicht.InformationsquelleAutor suvojit_007
Eigentlich wollte ich hinzufügen, dass diese als Kommentar, konnte aber nicht verschönern es einfach daher hinzufügen eine Antwort, bitte halte nicht dies als eine Antwort.
Dies ist, was ich Tat, zu verstehen, --
InformationsquelleAutor Pranav
Als die anderen Menschen, die in diesem Beitrag beantwortet die Frage im Detail, ich würde betonen vor allem der Vergleich zwischen
is
und==
für Streicher, in denen unterschiedliche Ergebnisse, und ich fordere Programmierer sorgfältig zu verwenden.Für string-Vergleich, stellen Sie sicher, dass Sie
==
stattis
:Out:
Aber in dem Beispiel weiter unten
==
undis
wird unterschiedliche Ergebnisse erhalten:Out:
Fazit:
Verwenden
is
sorgfältig zu vergleichen zwischen stringsNach den bisherigen Antworten: Es scheint, python führt eine Zwischenspeicherung auf small integer und strings, was bedeutet, dass es verwendet die gleiche Objektreferenz für den 'Hallo' string vorkommen in diesem code-snapshot, während es nicht-preform-caching für 'Hallo sam' so wie es ist relativ größer als "Hallo" (d.h. es verwaltet unterschiedliche Referenzen von 'Hallo sam' - string, und dass ' s warum der 'ist' operator false zurückgibt, in späteren Beispiel) Bitte korrigieren Sie mich, wenn ich falsch bin
InformationsquelleAutor imanzabet
Python Differenz zwischen ist-gleich(==)
Hier ist ein Beispiel zur Demonstration der ähnlichkeit und der Differenz.
InformationsquelleAutor Projesh Bhoumik
Wenn Sie es vergleichen mit JavaScript (jedoch nicht empfohlen, Sie zu vergleichen, eine Sprache vs. andere):
is
für strengen Vergleich. Javascript-äquivalent (===
)==
für Geschlechter-Vergleich.InformationsquelleAutor Bhojendra Rauniyar
"==" vergleicht die Werte
"" vergleicht die zugrunde liegenden Objekte
InformationsquelleAutor
o1 o2 => vergleicht, wenn o1 und o2 beide Punkte an derselben Stelle im Speicher (in anderen Worten, wenn Sie dasselbe Objekt)
o1 == o2 => hier python Aufruf der o1 die __cmp __(o2) - Methode, die sollte im Idealfall vergleicht den Wert und True oder False zurückgeben. (In anderen Worten, vergleicht es Wert)
Für JAVA-Menschen:
In Java, um festzustellen, ob zwei string-Variablen verweisen auf das gleiche
physischen Speicherort, indem str1 == str2. genannt (Objekt
Identität, und es ist geschrieben in Python als str1 ist str2).
Um in Java Zeichenfolgenwerte vergleichen, usestr1.equals(str2); in Python,
verwenden str1 == str2.
Beispiel:
Python-Shell output:
InformationsquelleAutor Jadav Bheda
Während alle diese Antworten, die sich auf die Durchführung von Widerspruchs-Zeiger-Vergleich vs-Wert-Vergleich sind wahrscheinlich richtig, da ist eine tiefere syntaktische Grund für die Verwendung
is
zu bestimmen, ob ein Wert der variable istNone
(in der booleschen Logik oft vertreten wieNULL
).In relationalen Datenbank-und andere Logik-Systeme
NULL
impliziert, dass der tatsächliche Wert "unbekannt". So ist die logische Ausdruckxx == NULL
muss immer bewerten zuNULL
selbst, wie es unmöglich ist, jemals zu wissen, wennxx
beliebigen Wert haben kann, ist die gleiche wie die unbekannten Wert. In Programmiersprachen, die sich eher strikt an die Regeln der booleschen Logikxx == NULL
(oder Pythonicallyxx == None
) korrekt ausgewertetNULL
, und alternative Mittel bereitgestellt werden müssen, um festzustellen, ob eine variable ein Wert istNULL
. Python ist ein Ausreißer in dieser Hinsicht, aufgrund der einheitlichen Natur der Referenz auf das ObjektNone
. Aber für Klarheit und logische Richtigkeit, die Verwendung der Python -is
Vergleichsoperator scheint mir wesentlich fundierter Praxis.r = None
haben, dann testen Sier == None
undr is None
. Beide zurückTrue
, was bedeutet, dassNone
ist eine Referenz auf ein Objekt, dessen WertNone
.InformationsquelleAutor Jimbopdx
Ja, es ist der Unterschied zwischen den beiden.
'in' : vergleicht Objekt-Referenz.
Betrachten wir nun diesen Fall:
InformationsquelleAutor Nitish Chauhan