613 Stimmen

String-Vergleich in Python: is vs. ==

Ich habe bemerkt, dass ein Python-Skript, das ich geschrieben habe, nicht richtig funktioniert, und habe es auf eine Endlosschleife zurückgeführt, deren Bedingung war while line is not '' . Bei der Überprüfung im Debugger stellte sich heraus, dass diese Zeile in der Tat '' . Als ich es in !='' statt is not '' hat es gut funktioniert.

Ist es außerdem generell besser, standardmäßig nur '==' zu verwenden, auch beim Vergleich von int- oder booleschen Werten? 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.

3 Stimmen

Inwiefern widerspricht dies Ihren Erfahrungen? NaN ist das einzige eingebaute Gegenbeispiel; Sie verstehen die Richtungsbeziehungen einfach falsch. Die Spezifikation sagt "Für alle eingebauten Python-Objekte (wie Strings, Listen, Dicts, Funktionen, etc.) gilt: Wenn x gleich y ist, dann ist x==y auch wahr.", nicht "Für alle eingebauten Python-Objekte (wie Strings, Listen, Dicts, Funktionen, etc.) gilt: Wenn x==y ist, dann ist x gleich y auch wahr." Aus irgendeinem Grund tust du so, als ob das Letztere hier steht. Das tut es aber nicht. Sie sehen, dass Gleichheit übereinstimmt, aber nicht wahr ist. Das ist nach der oben zitierten Aussage durchaus zulässig.

0 Stimmen

Ja. Ich habe das völlig durcheinander gelesen. Ich habe es aus der Frage herausgenommen, weil ich nicht glaube, dass es für künftige Leser von Nutzen sein wird.

2 Stimmen

O1 ist o2 => vergleicht, ob o1 und o2 auf dieselbe physische Stelle im Speicher zeigen (mit anderen Worten, ob sie dasselbe Objekt sind). Während, o1 == o2 => hier ruft Python die Methode __cmp__(o2) von o1 auf, die idealerweise den Wert vergleicht und True oder False zurückgibt. (Mit anderen Worten, es vergleicht den Wert) Für JAVA Leute: In Java kann man mit str1 == str2 feststellen, ob zwei String-Variablen auf denselben physischen Speicherplatz verweisen (dies wird Objektidentität genannt und in Python als str1 ist str2 geschrieben). Um String-Werte in Java zu vergleichen, verwendet man str1.equals(str2); in Python verwendet man str1 == str2.

668voto

dan04 Punkte 82011

F Strings, Listen, Dicts, Funktionen, usw.) gilt: Wenn x gleich y ist, dann ist x==y auch wahr.

Nicht immer. NaN ist ein Gegenbeispiel. Aber in der Regel , Identität ( is ) impliziert Gleichheit ( == ). Der umgekehrte Fall trifft nicht zu: Zwei unterschiedliche Objekte können denselben Wert haben.

Wird es allgemein als besser angesehen, einfach '==' b zu verwenden? wenn man int oder boolesche Werte vergleicht?

Sie verwenden == beim Vergleich von Werten und is beim Vergleich von Identitäten.

Beim Vergleich von ints (oder unveränderlichen Typen im Allgemeinen), Sie so ziemlich immer die erste wollen. Es gibt eine Optimierung, die es erlaubt, kleine Ganzzahlen mit is 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

Zum Vergleich mit None , is None ist vorzuziehen gegenüber == None .

I ich es ästhetisch ansprechender finde und pythonisch ist (und so bin ich in diese diese Falle getappt...), aber ich frage mich, ob es nur für die Fälle reserviert werden soll, in denen man zwei Objekte finden will mit der gleichen id.

Ja, genau dafür ist es gedacht.

282voto

pygabriel Punkte 9640

Ich möchte an einem kleinen Beispiel zeigen, wie is y == sind an unveränderlichen Typen beteiligt. Versuchen Sie 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 zum Beispiel sehen, dass kleine Ganzzahlen von Python zwischengespeichert werden:

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

Sie sollten Folgendes verwenden == beim Vergleich von Werten und is beim Vergleich von Identitäten. (Außerdem ist "equals" aus englischer Sicht etwas anderes als "is").

76voto

xubio Punkte 851

Die Logik ist nicht fehlerhaft. Die Aussage

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

sollte niemals so gelesen werden, dass es bedeutet

wenn x==y dann x ist y

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

27voto

pycruft Punkte 61389

見る Diese Frage

Ihre Logik beim Lesen

F Strings, Listen, Dicts, Funktionen, usw.) gilt: Wenn x gleich y ist, dann ist x==y auch wahr.

ist leicht fehlerhaft.

Wenn is gilt dann == ist True, gilt aber NICHT in umgekehrter Richtung. == kann True ergeben, während is ergibt Falsch.

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