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?

17voto

Zan Lynx Punkte 51045

Ich glaube, dass dies als "internierte" Zeichenketten bekannt ist. Python macht das, Java auch, und C und C++ auch, wenn sie im optimierten Modus kompilieren.

Wenn Sie zwei identische Zeichenketten verwenden, verweisen alle internierten Zeichenketten mit demselben Inhalt auf denselben Speicher, anstatt Speicher zu verschwenden, indem zwei Zeichenkettenobjekte erstellt werden.

Dies führt dazu, dass der Python-Operator "is" True zurückgibt, weil zwei Strings mit demselben Inhalt auf dasselbe String-Objekt verweisen. Dies geschieht auch in Java und C.

Dies ist jedoch nur nützlich, um Speicherplatz zu sparen. Sie können sich nicht darauf verlassen, um auf String-Gleichheit zu testen, da die verschiedenen Interpreter, Compiler und JIT-Engines dies nicht immer tun können.

14voto

Ram Punkte 1095

Eigentlich ist die is Operator prüft auf Identität und == Operator prüft auf Gleichheit.

Aus der Sprachreferenz:

Typen beeinflussen fast alle Aspekte des Objektverhaltens. Sogar die Bedeutung der Objektidentität wird in gewisser Weise beeinflusst: bei unveränderlichen Typen werden Operationen die neue Werte berechnen, können einen Verweis auf ein vorhandenes Objekt desselben Typs und desselben Werts zurückgeben, während dies bei veränderlichen Objekten nicht zulässig ist . So können sich z. B. nach a = 1; b = 1 a und b je nach Implementierung auf dasselbe Objekt mit dem Wert eins beziehen, aber nach c = []; d = [] beziehen sich c und d garantiert auf zwei verschiedene, eindeutige, neu erstellte leere Listen. (Man beachte, dass c = d = [] sowohl c als auch d das gleiche Objekt zuweist).

Aus der obigen Aussage können wir also ableiten, dass die Strings, die unveränderliche Typen sind, bei der Prüfung mit "is" fehlschlagen und bei der Prüfung mit "is" erfolgreich sein können.

Das Gleiche gilt für int y tuple die ebenfalls unveränderliche Typen sind.

7voto

johnashu Punkte 2131

is vergleicht die Speicherstelle. Er wird für den Vergleich auf Objektebene verwendet.

== werden die Variablen im Programm verglichen. Es wird für die Prüfung auf Werteebene verwendet.

is prüft die Äquivalenz auf Adressebene

== prüft die Äquivalenz der Wertebenen

2voto

Ryan Punkte 187

is ist die Identitätsprüfung und == ist die Gleichheitsprüfung (siehe die Python-Dokumentation ).

In den meisten Fällen, wenn a is b entonces a == b . Aber es gibt auch Ausnahmen, zum Beispiel:

>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False

Sie können also nur verwenden is für Identitätstests, niemals für Gleichheitstests.

-4voto

praveen kumar Punkte 11

Das grundlegende Konzept, über das wir uns im Klaren sein müssen, wenn wir uns dieser Frage nähern, besteht darin, den Unterschied zu verstehen zwischen es y \== .

"is" vergleicht den Speicherort. Wenn id(a)==id(b), dann ist a gleich b und gibt true zurück, sonst false.

Wir können also sagen, dass es wird für den Vergleich von Speicherplätzen verwendet. Wohingegen,

\== wird für die Gleichheitsprüfung verwendet, was bedeutet, dass nur die sich ergebenden Werte verglichen werden. Der unten gezeigte Code kann als Beispiel für die oben genannte Theorie dienen.

Code

Click here for the code

Im Falle von String-Literalen (Strings ohne Zuweisung zu Variablen) ist die Speicheradresse dieselbe wie in der Abbildung. id(a)==id(b). Der Rest ist selbsterklärend.

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