1322 Stimmen

Warum führt der Vergleich von Zeichenketten mit "==" oder "ist" manchmal zu einem anderen Ergebnis?

Zwei String-Variablen werden auf denselben Wert gesetzt. s1 == s2 gibt immer zurück True aber s1 is s2 kehrt manchmal zurück False .

Wenn ich meinen Python-Interpreter öffne und das Gleiche tue is Vergleich gelingt es:

>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True

Warum ist das so?

40voto

Gregg Lind Punkte 19744

Dies ist eine Randnotiz, aber in idiomatischem Python sieht man oft Dinge wie:

if x is None:
    # Some clauses

Dies ist sicher, denn Es gibt garantiert eine Instanz des Null-Objekts (d. h. None). .

34voto

Mattias Nilsson Punkte 3534

Wenn Sie sich nicht sicher sind, was Sie tun, verwenden Sie das '=='. Wenn Sie etwas mehr Wissen haben, können Sie 'is' für bekannte Objekte wie 'None' verwenden.

Sonst werden Sie sich am Ende fragen, warum etwas nicht funktioniert und warum das passiert:

>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False

Ich bin nicht einmal sicher, ob einige Dinge garantiert gleich bleiben zwischen verschiedenen Python-Versionen/Implementierungen.

26voto

Jack M. Punkte 27217

Aus meiner begrenzten Erfahrung mit Python, is wird verwendet, um zwei Objekte zu vergleichen, um festzustellen, ob es sich um dasselbe Objekt handelt oder um zwei verschiedene Objekte mit demselben Wert. == wird verwendet, um festzustellen, ob die Werte identisch sind.

Hier ist ein gutes Beispiel:

>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True

s1 ist eine Unicode-Zeichenkette, und s2 ist eine normale Zeichenkette. Sie sind nicht vom gleichen Typ, haben aber den gleichen Wert.

22voto

meder omuraliev Punkte 177513

Ich denke, es hat damit zu tun, dass zwei verschiedene Objekte verwendet werden, wenn der "is"-Vergleich als falsch bewertet wird. Wenn er auf "true" ausgewertet wird, bedeutet das, dass intern genau dasselbe Objekt verwendet wird und kein neues erstellt wird, möglicherweise weil Sie sie innerhalb eines Bruchteils von 2 oder so Sekunden erstellt haben und weil es keine große Zeitspanne dazwischen gibt, ist es optimiert und verwendet dasselbe Objekt.

Aus diesem Grund sollten Sie den Gleichheitsoperator verwenden == , nicht is , um den Wert eines String-Objekts zu vergleichen.

>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>> 

In diesem Beispiel habe ich s2, das ein anderes String-Objekt war, zuvor mit "eins" gleichgesetzt, aber es ist nicht dasselbe Objekt wie s weil der Interpreter nicht dasselbe Objekt verwendet hat, da ich es ursprünglich nicht "eins" zugewiesen habe, sonst wären sie dasselbe Objekt.

18voto

X. Wang Punkte 811

El == Operator prüft die Wertgleichheit. Der is Operator testet die Objektidentität, und Python prüft, ob es sich tatsächlich um dasselbe Objekt handelt (d. h., ob es an derselben Adresse im Speicher liegt).

>>> a = 'banana'
>>> b = 'banana'
>>> a is b
True

In diesem Beispiel hat Python nur ein String-Objekt erstellt, und beide a y b bezieht sich darauf. Der Grund dafür ist, dass Python einige Zeichenketten intern zwischenspeichert und wiederverwendet, um sie zu optimieren. Es gibt wirklich nur eine Zeichenkette "banana" im Speicher, die sich a und b teilen. Um das normale Verhalten auszulösen, müssen Sie längere Zeichenketten verwenden:

>>> a = 'a longer banana'
>>> b = 'a longer banana'
>>> a == b, a is b
(True, False)

Wenn Sie zwei Listen erstellen, erhalten Sie zwei Objekte:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

In diesem Fall würden wir sagen, dass die beiden Listen äquivalent sind, weil sie die gleichen Elemente haben, aber nicht identisch, weil sie nicht dasselbe Objekt sind. Wenn zwei Objekte identisch sind, sind sie auch äquivalent, aber wenn sie äquivalent sind, sind sie nicht unbedingt identisch.

Si a bezieht sich auf ein Objekt und Sie weisen b = a dann beziehen sich beide Variablen auf dasselbe Objekt:

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True

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