Confronto tra stringhe in Python: is vs. ==
Ho notato che uno script Python che stavo scrivendo si comportava in modo strano, e l'ho ricondotto a un ciclo infinito, dove la condizione del ciclo era "mentre la linea non è ''. Eseguendolo nel debugger, si è scoperto che la linea era in effetti
'''. Quando l'ho cambiato in
!='''piuttosto che
è non ''`, ha funzionato bene.
Inoltre, è generalmente considerato meglio usare solo '==' per default, anche quando si confrontano valori int o booleani? Mi è sempre piaciuto usare 'is'perché lo trovo esteticamente più piacevole e pitonico (ed è così che sono caduto in questa trappola...), ma mi chiedo se è destinato ad essere riservato solo per quando ci si preoccupa di trovare due oggetti con lo stesso id.
519
3
Non sempre. NaN è un controesempio. Ma di solito, l'identità (
è
) implica l'uguaglianza (==
). Il contrario non è vero: due oggetti distinti possono avere lo stesso valore.Inoltre, è generalmente considerato migliore usare semplicemente '==' per default, anche quando si confrontano valori int o booleani?
Si usa
==
quando si confrontano i valori eè
quando si confrontano le identità.Quando si confrontano int (o tipi immutabili in generale), si vuole praticamente sempre il primo. C'è un'ottimizzazione che permette ai piccoli interi di essere confrontati con
is
, ma non fateci affidamento.Per i valori booleani, non si dovrebbe fare alcun confronto. Invece di:
scrivere:
Per il confronto con
None
,is None
è preferito a== None
.Sì, è esattamente a questo che serve.
Vorrei mostrare un piccolo esempio su come
è
e==
sono coinvolti nei tipi immutabili. Provate a farlo:is
confronta due oggetti in memoria,==
confronta i loro valori. Per esempio, potete vedere che i piccoli interi sono memorizzati nella cache da Python:Dovreste usare
==
quando confrontate i valori eis
quando confrontate le identità. (Inoltre, da un punto di vista inglese, "equals" è diverso da "is").Vedi Questa domanda
La tua logica nella lettura
Per tutti gli oggetti built-in di Python (come stringhe, liste, ditt, funzioni, ecc.), se x è y, allora x==y è anche vero.
è leggermente difettoso.
Se
è
si applica allora==
sarà Vero, ma NON si applica al contrario.==
può dare come risultato True mentreis
dà come risultato False.