it-swarm.com.de

String-Vergleich in Python: ist vs. ==

Ich bemerkte, dass ein Skript Python, das ich schrieb, sich wie ein Eichhörnchen verhält, und verfolgte es auf eine Endlosschleife, bei der die Schleifenbedingung while line is not '' war. Als ich es im Debugger durchging, stellte sich heraus, dass es sich bei der Zeile tatsächlich um '' handelte. Als ich es zu !='' anstatt zu is not '' geändert habe, hat es gut funktioniert.

Wird es im Allgemeinen auch als besser angesehen, standardmäßig nur '==' zu verwenden, selbst wenn int- oder boolesche Werte verglichen werden? Ich habe es immer gemocht, "ist" zu verwenden, weil ich es ästhetischer und pythonischer finde (so bin ich in diese Falle geraten ...), aber ich frage mich, ob es nur reserviert sein soll, wenn es Ihnen wichtig ist, zwei zu finden Objekte mit der gleichen ID.

510
Coquelicot

Für alle integrierten Python -Objekte (wie Zeichenfolgen, Listen, Befehle, Funktionen usw.) ist x = y und x == y ebenfalls True.

Nicht immer. NaN ist ein Gegenbeispiel. Aber normalerweise, Identität (is) impliziert Gleichheit (==). Das Gegenteil ist nicht der Fall: Zwei unterschiedliche Objekte können denselben Wert haben.

Wird es im Allgemeinen auch als besser angesehen, standardmäßig nur '==' zu verwenden, selbst wenn int- oder boolesche Werte verglichen werden?

Sie verwenden == zum Vergleichen von Werten und is zum Vergleichen von Identitäten.

Wenn Sie ints (oder unveränderliche Typen im Allgemeinen) vergleichen, möchten Sie so ziemlich immer das erstere. Es gibt eine Optimierung, die es ermöglicht, kleine ganze Zahlen mit is zu vergleichen, sich jedoch nicht darauf zu verlassen.

Für boolesche Werte sollten Sie überhaupt keine Vergleiche durchführen. Anstatt von:

if x == True:
    # do something

schreiben:

if x:
    # do something

Für den Vergleich mit None wird is None gegenüber == None bevorzugt.

Ich habe 'is' immer gern benutzt, weil ich es ästhetischer und pythonischer finde (so bin ich in diese Falle geraten ...), aber ich frage mich, ob es nur reserviert sein soll, wenn es Ihnen wichtig ist, zwei zu finden Objekte mit der gleichen ID.

Ja, genau dafür ist es.

580
dan04

Ich möchte ein kleines Beispiel zeigen, wie is und == an unveränderlichen Typen beteiligt sind. Versuch das:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is vergleicht zwei Objekte im Speicher, == vergleicht ihre Werte. Sie können beispielsweise sehen, dass kleine Ganzzahlen von Python zwischengespeichert werden:

c = 1
b = 1
>>> b is c
True

Sie sollten == zum Vergleichen von Werten und is zum Vergleichen von Identitäten verwenden. (Auch aus englischer Sicht unterscheidet sich "equals" von "is".)

251
pygabriel

Die Logik ist nicht fehlerhaft. Die Aussage

wenn x y ist, dann ist x == y auch wahr

sollte nie gelesen werden, um zu bedeuten

wenn x == y, dann ist x y

Es ist ein logischer Fehler des Lesers anzunehmen, dass die Umkehrung einer logischen Aussage wahr ist. Siehe http://en.wikipedia.org/wiki/Converse_ (logic)

68
xubio

Siehe Diese Frage

Ihre Logik beim Lesen

Für alle eingebauten Python -Objekte (wie Zeichenfolgen, Listen, Befehle, Funktionen usw.) ist x = y und x == y ebenfalls True.

ist leicht fehlerhaft.

Wenn is zutrifft, ist == True, gilt jedoch NICHT umgekehrt. == kann True ergeben, während is False ergibt.

26
pycruft