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.

Soluzione

Per tutti gli oggetti built-in di Python (come stringhe, liste, ditt, funzioni, ecc.), se x è y, allora x==y è anche vero.

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:

if x == True:
    # do something

scrivere:

if x:
    # do something

Per il confronto con None, is None è preferito a == None.

Mi è sempre piaciuto usare 'is' perché lo trovo esteticamente più gradevole e pitonico (che è il modo in cui sono caduto in questa trappola...), ma mi chiedo se destinato ad essere riservato solo per quando ti interessa trovare due oggetti con lo stesso id.

Sì, è esattamente a questo che serve.

Commentari (18)

Vorrei mostrare un piccolo esempio su come è e == sono coinvolti nei tipi immutabili. Provate a farlo:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is confronta due oggetti in memoria, == confronta i loro valori. Per esempio, potete vedere che i piccoli interi sono memorizzati nella cache da Python:

c = 1
b = 1
>>> b is c
True

Dovreste usare == quando confrontate i valori e is quando confrontate le identità. (Inoltre, da un punto di vista inglese, "equals" è diverso da "is").

Commentari (4)

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 mentre is dà come risultato False.

Commentari (2)