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.
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.
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".)
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)
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.