Ho un programma Python in cui due variabili sono impostate sul valore 'public'
. In un'espressione condizionale ho il confronto var1 è var2
che fallisce, ma se lo cambio in var1 == var2
restituisce True
.
Ora se apro il mio interprete Python e faccio lo stesso confronto "is", ha successo.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Cosa mi manca qui?
is
è il test di identità, ==
è il test di uguaglianza. ciò che accade nel vostro codice verrebbe emulato nell'interprete in questo modo:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
quindi, non c'è da stupirsi che non siano la stessa cosa, giusto?
In altre parole: è
è il id(a) == id(b)
La parola chiave is
è un test per l'identità dell'oggetto, mentre ==
è un confronto di valori.
Se usate is
, il risultato sarà vero se e solo se l'oggetto è lo stesso. Tuttavia, ==
sarà vero ogni volta che i valori dell'oggetto sono gli stessi.
Penso che abbia a che fare con il fatto che, quando il confronto 'is'valuta a false, vengono usati due oggetti distinti. Se valuta a true, significa che internamente sta usando lo stesso esatto oggetto e non ne sta creando uno nuovo, forse perché li hai creati in una frazione di 2 secondi o giù di lì e poiché non c'è un grande intervallo di tempo in mezzo è ottimizzato e usa lo stesso oggetto.
Questo è il motivo per cui dovresti usare l'operatore di uguaglianza ==
, non è
, per confrontare il valore di un oggetto stringa.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
In questo esempio, ho reso s2, che era un oggetto stringa diverso precedentemente uguale a 'one' ma non è lo stesso oggetto di s
, perché l'interprete non ha usato lo stesso oggetto in quanto non l'ho assegnato inizialmente a 'one', se l'avessi fatto li avrebbe resi lo stesso oggetto.