'var is None' vs 'var == None'

4

Spesso vedo var is None nel codice Python, usando is per testare l'uguaglianza funziona solo per pochissimi oggetti come None . Ero solito pensare che è meglio usare == per confrontare l'uguaglianza anche se is è possibile e usare is solo se vuoi testare la stessa identità.

Tuttavia, mi sembra che la maggior parte dei programmatori preferisca var is None a var == None . La mia impressione è errata o esiste una buona ragione per cui le persone preferiscono is ?

    
posta timakro 10.06.2016 - 16:02
fonte

2 risposte

10

La ragione autorevole è perché PEP-8 dice così:

Comparisons to singletons like None should always be done with is or is not, never the equality operators.

Quindi, se ti trovi in un disperato bisogno di confrontare esattamente con True o False, dovresti usare is . Ricorda: in casi come questi, la "verità" è generalmente preferita rispetto al confronto con un valore reale. Cioè,

if somevar:
    ...

su

if somevar is True:
    ...

o

if somevar == True:
    ...

I principali vantaggi che vedo stanno enfatizzando il desiderio esplicito di confrontare l'identità con un built-in e l'incapacità di interrompere il confronto definendo __eq__ su oggetti arbitrari.

Come nota a margine, hai detto:

I used to think that it's better practice to use == to compare equality even if is is possible and to use is only if you want to test for the same identity.

Questa non è semplicemente una "pratica migliore". L'uguaglianza e l'identità sono la differenza tra questi costrutti linguistici e dovrebbero essere assolutamente utilizzati in questo modo.

    
risposta data 16.06.2016 - 05:42
fonte
0

in realtà, non si tratta di stile di programmazione, is e == sono molto diversi:

l'operatore is controlla se i due elementi fanno riferimento allo stesso oggetto

l'operatore == controlla se gli oggetti di riferimento dei due elementi sono identici

ad esempio:

l = [1,2,3,4,5,6,7,8,9,1,2,3,4,]
l2 = l         # make ir reference the object that l references
l3 = l[:]      # copy it so reference identicle objects

l is l2 # same objects
True

l == l2 # identical objects
True

l is l3 # same objects
False

l == l3 # identical object
True

quando si divide l'elenco, lo si copia e si crea un altro oggetto identico ad esso; quando dici l2 = l stai creando una nuova variabile che fa riferimento allo stesso oggetto

fonte: Learning Python 5th edition di Mark Lutz; parte II: Tipi e operazioni, capitolo 6: Dynamic Typing Interlude pp. 180-184

    
risposta data 13.07.2016 - 17:51
fonte

Leggi altre domande sui tag