variable Python Nenhuma comparação: devo usar “is” ou==?




python is true (3)

Duplicata Possível:
Quando o operador `==` não é equivalente ao operador `is`? (Python)

Eu estou usando o Python 2.x.

Meu editor me dá um sublinhado de 'aviso' quando eu comparo my_var == None , mas nenhum aviso quando eu uso my_var is None .

Eu fiz um teste no shell do Python e determinei que ambos são válidos, mas meu editor parece estar dizendo que my_var is None é o preferido.

É este o caso e, em caso afirmativo, por quê?


O PEP 8 define que é melhor usar o operador is ao comparar singletons.


Resumo:

Use is quando você deseja verificar a identidade de um objeto (por exemplo, verificando se var é None ). Use == quando você quiser verificar a igualdade (por exemplo, é var igual a 3 ?).

Explicação:

Você pode ter classes personalizadas onde my_var == None retornará True

por exemplo:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

is verificação da identidade do objeto. Existe apenas 1 objeto None , então quando você faz my_var is None , você está verificando se eles são realmente o mesmo objeto (não apenas objetos equivalentes )

Em outras palavras, == é uma verificação de equivalência (que é definida de objeto para objeto), enquanto que is verificada a identidade do objeto:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

is é geralmente preferido ao comparar objetos arbitrários com singletons como None porque é mais rápido e previsível. is sempre comparado por identidade de objeto, enquanto o que == fará depende do tipo exato dos operandos e até mesmo de sua ordenação.

Esta recomendação é apoiada pelo PEP 8 , que afirma explicitamente que "comparações com singletons como None devem sempre ser feitas com ou is not , nunca com operadores de igualdade".







nonetype