Die anderen Antworten sind richtig: is
wird verwendet für Identität Vergleich, während ==
wird verwendet für Gleichstellung Vergleich. Da es Ihnen um die Gleichheit geht (die beiden Zeichenketten sollten die gleichen Zeichen enthalten), wird in diesem Fall die is
Operator ist einfach falsch, und Sie sollten den ==
stattdessen.
Der Grund is
interaktiv funktioniert, ist, dass (die meisten) String-Literale interniert standardmäßig. Aus Wikipedia:
Internierte Zeichenketten beschleunigen String Vergleiche, die manchmal einen Leistungsengpass in Anwendungen (wie Compilern und dynamischen Programmiersprachen-Laufzeiten), die stark auf Hash-Tabellen mit String-Schlüsseln String-Schlüsseln. Ohne Internierung, die Überprüfung, ob zwei verschiedene Zeichenketten gleich sind, muss jeder Zeichen beider Zeichenketten. Dies ist aus mehreren Gründen langsam: Es ist von Natur aus O(n) für die Länge der Zeichenketten; es erfordert typischerweise Lesevorgänge aus mehreren Speicherregionen, was Zeit Zeit in Anspruch nehmen; und das Lesen füllt den Prozessor-Cache, was bedeutet, dass weniger Cache für andere Zwecke zur Verfügung steht. Mit internierten Strings reicht ein einfacher Objekt Identitätstest aus, nachdem die ursprünglichen internen Operation; dies wird typischerweise als Zeiger Gleichheitstest implementiert, normalerweise nur ein einziger Maschinenbefehl ohne Speicher Referenz überhaupt.
Wenn Sie also zwei String-Literale (Wörter, die buchstäblich in den Quellcode Ihres Programms eingegeben werden, umgeben von Anführungszeichen) in Ihrem Programm haben, die denselben Wert haben, interniert der Python-Compiler die Strings automatisch, so dass sie beide an derselben Speicherstelle gespeichert werden. (Beachten Sie, dass dies nicht toujours passieren, und die Regeln, wann dies geschieht, sind ziemlich verworren, also verlassen Sie sich bitte nicht auf dieses Verhalten im Produktionscode).
Da in Ihrer interaktiven Sitzung beide Zeichenketten am gleichen Speicherort gespeichert sind, haben sie den gleichen Identität , so dass die is
Operator funktioniert wie erwartet. Wenn Sie jedoch eine Zeichenkette mit einer anderen Methode konstruieren (auch wenn diese Zeichenkette genau die gleichen Zeichen), dann kann die Zeichenfolge gleich aber es ist nicht die gleiche Zeichenkette -- das heißt, sie hat eine andere Identität weil sie an einer anderen Stelle im Speicher abgelegt ist.