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 in
ist 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.
519
3
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
Sie verwenden
==
, wenn Sie Werte vergleichen, undist
, 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:
schreiben:
Für den Vergleich mit
None
wirdis None
gegenüber== None
bevorzugt.Ich habe 'is' immer gerne verwendet, weil
Ja, das ist genau das, wofür es gedacht ist.
Ich möchte an einem kleinen Beispiel zeigen, wie
ist
und==
bei unveränderlichen Typen beteiligt sind. Versuchen Sie das:ist
vergleicht zwei Objekte im Speicher,==
vergleicht ihre Werte. Sie können zum Beispiel sehen, dass kleine Ganzzahlen von Python zwischengespeichert werden:Sie sollten
==
verwenden, wenn Sie Werte vergleichen, undis
, wenn Sie Identitäten vergleichen. (Außerdem ist "equals" aus englischer Sicht etwas anderes als "is".)Siehe Diese Frage
Ihre Logik beim Lesen
ist leicht fehlerhaft.
Wenn
ist
zutrifft, dann wird==
wahr sein, aber es gilt NICHT umgekehrt.==
kann True ergeben, währendis
False ergibt.