2012-10-03 4 views
5

Mögliche Duplizieren:
String comparison in Python: is vs. ==
Python string interning
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?Python: Warum Operator "ist" und "==" sind manchmal für Zeichenfolgen austauschbar?

habe ich versehentlich is und == für Streicher austauschbar, aber ich entdeckte, ist nicht immer gleich.

>>> Folder = "locales/" 
>>> Folder2 = "locales/" 
>>> Folder is Folder2 
False 
>>> Folder == Folder2 
True 
>>> File = "file" 
>>> File2 = "file" 
>>> File is File2 
True 
>>> File == File2 
True 
>>> 

Warum in einem Fall Operatoren sind austauschbar und in der anderen nicht?

+0

Rau aus dieser Gewohnheit haben! Strings mit "is" zu vergleichen ist nicht zuverlässig und nicht portabel über Python-Plattformen (CPython/jython/Iron Python). Vergleichen Sie Zeichenfolgen mit '=='. Save 'is' für den Identitätsvergleich mit Singletons (wie' None') oder Objekten Ihrer eigenen Kreation. Verwenden Sie "Ist" auch zum Vergleichen von Ints? Das ist genauso unzuverlässig. – PaulMcG

+0

@PaulMcGuire Ich habe das nicht benutzt, aber habe es zufällig entdeckt. Und dann probierte es und entdeckte die obige Inkonsistenz. –

+1

Andere relevante Fragen, die als Täuschungsziele in Betracht gezogen werden könnten: [Warum führt das Vergleichen von Strings in Python mit '==' oder 'is' manchmal zu einem anderen Ergebnis?] (Http://stackoverflow.com/q/1504717) und [ Python String Interning] (http://stackoverflow.com/q/15541404) –

Antwort

12

Kurze Zeichenketten sind für die Effizienz interniert, also beziehen sich auf das gleiche Objekt daher is wird wahr.

Dies ist ein Implementierungsdetail in CPython und ist absolut nicht verlässlich.

+0

Interessante Python Trivia: Sie können jede gegebene Zeichenfolge mit dem Aufruf intern() internieren. –

3

Der Operator == ruft die interne Methode __cmp__() des ersten Objekts auf, die es mit der zweiten vergleicht. Dies gilt für alle Python-Objekte einschließlich Strings. Der Operator is vergleicht die Identität der Objekte:

Jedes Objekt hat eine Identität, einen Typ und einen Wert. Die Identität eines Objekts ändert sich nie, sobald es erstellt wurde; Sie können es sich als die Adresse des Objekts im Speicher vorstellen. Der Operator 'ist' vergleicht die Identität zweier Objekte. Die Funktion id() gibt eine ganze Zahl zurück, die ihre Identität darstellt (derzeit als ihre Adresse implementiert).

ZB:

s1 = 'abc' 
id(s1) 
>>> 140058541968080 
s2 = 'abc' 
id(s2) 
>>> 140058541968080 

# The values the same due to SPECIFIC CPython behvaiour which detects 
# that the value exists in interpreter's memory thus there is no need 
# to store it twice. 

s1 is s2 
>>> True 

s2 = 'cde' 
id(s2) 
>>> 140058541968040 
s1 is s2 
>>> False  
4

Diese Frage wirft mehr Licht auf sie: String comparison in Python: is vs. ==

Die kurze Antwort lautet: == Tests für den gleichen Wert, wo is Tests für gleiche Identität (via Objektreferenz).

Die Tatsache, dass zwei Strings mit gleichem Wert gleich Identität schlägt nun vor dem Python-Interpreter optimiert, wie Daniel Roseman bestätigt :)

Verwandte Themen