String-Vergleich in Python: is vs. ==

Mir ist aufgefallen, dass ein Python-Skript, das ich geschrieben habe, sich seltsam verhielt, und ich habe es auf eine Endlosschleife zurückgeführt, in der die Schleifenbedingung "while line is not ''" war. Als ich das Skript im Debugger durchging, stellte sich heraus, dass die Zeile tatsächlich''war. Als ich sie in!=''und nicht inist nicht ''` änderte, funktionierte es gut.

Ist es generell besser, standardmäßig '==' zu verwenden, auch wenn man int oder boolesche Werte vergleicht? Ich habe immer gerne 'is' verwendet, weil ich es ästhetisch ansprechender und pythonischer finde (so bin ich in diese Falle getappt...), aber ich frage mich, ob es nur für den Fall reserviert werden soll, dass man zwei Objekte mit der gleichen ID finden will.

Lösung

Für alle eingebauten Python-Objekte (wie Strings, Listen, Dicts, Funktionen, usw.), wenn x gleich y ist, dann ist x==y auch Wahr.

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

Wird es allgemein als besser angesehen, standardmäßig '==' zu verwenden, auch

beim Vergleich von int- oder booleschen Werten?

Sie verwenden ==, wenn Sie Werte vergleichen, und ist, wenn Sie Identitäten vergleichen.

Beim Vergleich von Ints (oder unveränderlichen Typen im Allgemeinen) sollte man so gut wie immer Ersteres verwenden. Es gibt eine Optimierung, die es erlaubt, kleine Ganzzahlen mit "is" zu vergleichen, aber verlassen Sie sich nicht darauf.

Für boolesche Werte sollten Sie überhaupt keine Vergleiche anstellen. Stattdessen:

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 gerne verwendet, weil

ich es ästhetisch ansprechender finde und pythonisch (und so bin ich in diese Falle...), aber ich frage mich, ob es's dafür gedacht ist, nur reserviert zu sein, wenn man sich darum kümmert, zwei Objekte zu finden mit der gleichen id.

Ja, das ist genau das, wofür es gedacht ist.

Kommentare (18)

Ich möchte an einem kleinen Beispiel zeigen, wie ist und == bei unveränderlichen Typen beteiligt sind. Versuchen Sie das:

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

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

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

Sie sollten == verwenden, wenn Sie Werte vergleichen, und is, wenn Sie Identitäten vergleichen. (Außerdem ist "equals" aus englischer Sicht etwas anderes als "is".)

Kommentare (4)

Siehe Diese Frage

Ihre Logik beim Lesen

Für alle eingebauten Python-Objekte (wie Strings, Listen, Dicts, Funktionen, usw.), wenn x gleich y ist, dann ist x==y auch Wahr.

ist leicht fehlerhaft.

Wenn ist zutrifft, dann wird == wahr sein, aber es gilt NICHT umgekehrt. == kann True ergeben, während is False ergibt.

Kommentare (2)