628 Stimmen

Gibt es einen Unterschied zwischen "==" und "ist"?

Meine Google-fu hat mich im Stich gelassen.

Sind die beiden folgenden Gleichheitstests in Python gleichwertig?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

Gilt dies auch für Objekte, bei denen Sie Instanzen vergleichen würden (eine list sagen)?

Okay, das beantwortet meine Frage:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

Also == Testwert, bei dem is Tests, um festzustellen, ob es sich um dasselbe Objekt handelt?

21voto

Dan Lenski Punkte 72055

Sie sind völlig anders . is prüft auf Objektidentität, während == prüft auf Gleichheit (ein Begriff, der von den Typen der beiden Operanden abhängt).

Es ist nur ein glücklicher Zufall, dass " is " scheint bei kleinen ganzen Zahlen korrekt zu funktionieren (z. B. 5 == 4+1). Das liegt daran, dass CPython optimiert die Speicherung von Ganzzahlen im Bereich (-5 bis 256), indem es sie zu Singletons macht . Dieses Verhalten ist völlig implementierungsabhängig und kann nicht garantiert werden, dass es bei allen Arten von geringfügigen Umwandlungsoperationen erhalten bleibt.

Python 3.5 zum Beispiel macht auch kurze Strings zu Singletons, aber das Zerschneiden von Strings unterbricht dieses Verhalten:

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False

12voto

mmaibaum Punkte 2289

https://docs.python.org/library/stdtypes.html#comparisons

is Tests zur Identitätsprüfung == Tests für Gleichheit

Jeder (kleine) ganzzahlige Wert wird auf einen einzigen Wert abgebildet, so dass alle 3 identisch und gleich sind. Dies ist ein Implementierungsdetail und nicht Teil der Sprachspezifikation.

7voto

Dave Webb Punkte 184809

Ihre Antwort ist richtig. Die is Operator vergleicht die Identität von zwei Objekten. Der == Operator vergleicht die Werte von zwei Objekten.

Die Identität eines Objekts ändert sich nie mehr, wenn es einmal erstellt wurde; man kann sie sich als die Adresse des Objekts im Speicher vorstellen.

Sie können das Vergleichsverhalten von Objektwerten steuern, indem Sie eine __cmp__ Methode oder eine reicher Vergleich Methode wie __eq__ .

5voto

cobbal Punkte 68319

Werfen Sie einen Blick auf Stack Overflow Frage Pythons "is"-Operator verhält sich unerwartet bei ganzen Zahlen .

Im Wesentlichen läuft es darauf hinaus, dass " is " prüft, ob es sich um dasselbe Objekt handelt, nicht nur um eine Gleichheit (die Zahlen unter 256 sind ein Sonderfall).

5voto

imanzabet Punkte 2354

Wie die anderen Personen in diesem Beitrag beantworten die Frage im Detail den Unterschied zwischen == y is für den Vergleich von Objekten oder Variablen, würde ich hervorheben. hauptsächlich der Vergleich zwischen is y == für Saiten die zu unterschiedlichen Ergebnissen führen können, und ich möchte die Programmierer auffordern, sie sorgfältig zu verwenden.

Für den Vergleich von Zeichenketten sollten Sie die == anstelle von is :

str = 'hello'
if (str is 'hello'):
    print ('str is hello')
if (str == 'hello'):
    print ('str == hello')

Aus:

str is hello
str == hello

Aber im folgenden Beispiel == y is werden unterschiedliche Ergebnisse erzielt:

str2 = 'hello sam'
    if (str2 is 'hello sam'):
        print ('str2 is hello sam')
    if (str2 == 'hello sam'):
        print ('str2 == hello sam')

Aus:

str2 == hello sam

Schlussfolgerung und Analyse:

Verwenden Sie is sorgfältig, um zwischen Zeichenketten zu vergleichen. Da is für den Vergleich von Objekten und da in Python 3+ jede Variable wie z.B. String als Objekt interpretiert wird, wollen wir sehen, was in den obigen Absätzen passiert ist.

In Python gibt es [id](https://www.geeksforgeeks.org/id-function-python/#:%7E:text=id()%20is%20an%20inbuilt,the%20same%20id()%20value.) Funktion, die eine eindeutige Konstante eines Objekts während seiner Lebensdauer anzeigt. Diese ID wird im Backend des Python-Interpreters verwendet, um zwei Objekte mit is Stichwort.

str = 'hello'
id('hello')
> 140039832615152
id(str)
> 140039832615152

Aber

str2 = 'hello sam'
id('hello sam')
> 140039832615536
id(str2)
> 140039832615792

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X