2012-10-03 11 views
5

Eventuali duplicati:
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: Perché l'operatore "è" e "==" sono talvolta intercambiabili per le stringhe?

ho usato per sbaglio is e == per le stringhe in modo intercambiabile, ma ho scoperto non è sempre lo stesso.

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

Perché in un caso gli operatori sono intercambiabili e nell'altro no?

+0

uscire da questa abitudine ADESSO! Confrontare le stringhe con 'is' non è affidabile e non portabile su piattaforme Python (CPython/jython/Iron Python). Confronta le stringhe con '=='. Salva 'is' per il confronto delle identità con singleton (come' None') o oggetti di tua creazione. Usi 'is' anche per confrontare gli interi? Questo è altrettanto inaffidabile. – PaulMcG

+0

@PaulMcGuire Non l'ho usato ma l'ho scoperto per caso. E poi provato e scoperto l'incoerenza di cui sopra. –

+1

Altre domande pertinenti che potrebbero essere considerate obiettivi dupe: [Perché confrontare stringhe in Python usando '==' o 'is' a volte produce un risultato diverso?] (Http://stackoverflow.com/q/1504717) e [ Python string interning] (http://stackoverflow.com/q/15541404) –

risposta

12

Le stringhe corte sono internate per l'efficienza, quindi farà riferimento allo stesso oggetto pertanto is sarà vero.

Questo è un dettaglio di implementazione in CPython, ed è assolutamente da non fare affidamento.

+0

Curiosità interessante di Python: puoi internare qualsiasi stringa data con la chiamata intern(). –

3

L'operatore == chiama il metodo interno __cmp__() del primo oggetto che lo confronta con il secondo. Questo è vero per tutti gli oggetti Python incluse le stringhe. L'operatore is confronta l'identità dell'oggetto:

Ogni oggetto ha un'identità, un tipo e un valore. L'identità di un oggetto non cambia mai una volta che è stata creata; potresti pensarlo come l'indirizzo dell'oggetto in memoria. L'operatore 'è' confronta l'identità di due oggetti; la funzione id() restituisce un numero intero che rappresenta la sua identità (attualmente implementato come suo indirizzo).

Es:

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

Questa domanda getta più luce su di esso: String comparison in Python: is vs. ==

La risposta è: == test per valore uguale is test a parità identità (tramite riferimento all'oggetto).

Il fatto che 2 stringhe con pari valore hanno pari identità suggerisce l'interprete Python è l'ottimizzazione, come Daniel Roseman conferma :)

Problemi correlati