Python Language Confronto con `is` vs` == `


Esempio

Un errore comune è confondere gli operatori di confronto di uguaglianza is e == .

a == b confronta il valore di a e b .

a is b confronterà le identità di a e b .

Illustrare:

a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False

a = [1, 2, 3, 4, 5]
b = a      # b references a
a == b     # True
a is b     # True
b = a[:]   # b now references a copy of a
a == b     # True
a is b     # False [!!]

Fondamentalmente, is può essere pensato come abbreviazione di id(a) == id(b) .

Oltre a ciò, ci sono stranezze dell'ambiente di runtime che complicano ulteriormente le cose. Le stringhe corte e gli interi piccoli restituiscono True se confrontati con is , a causa del tentativo della macchina Python di utilizzare meno memoria per oggetti identici.

a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True

Ma stringhe più lunghe e interi più grandi verranno memorizzati separatamente.

a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False

È necessario utilizzare is per verificare per None :

if myvar is not None:
    # not None
    pass
if myvar is None:
    # None
    pass

L'uso di is è di testare un "sentinel" (cioè un oggetto unico).

sentinel = object()
def myfunc(var=sentinel):
    if var is sentinel:
        # value wasn’t provided
        pass
    else:
        # value was provided
        pass