Meu editor me avisa quando comparo my_var == None
, mas nenhum aviso quando uso my_var is None
.
Fiz um teste no shell do Python e determinei que ambas são sintaxe válida, mas meu editor parece estar dizendo que my_var is None
é o preferido.
É esse o caso? Se sim, por quê?
python
comparison
nonetype
Clay Wardell
fonte
fonte
is
- python.org/dev/peps/pep-0008/#programming-recommendationsRespostas:
Resumo:
Use
is
quando quiser verificar a identidade de um objeto (por exemplo, verificar sevar
existeNone
). Use==
quando quiser verificar a igualdade (por exemplo, évar
igual a3
?).Explicação:
Você pode ter classes personalizadas onde
my_var == None
retornaráTrue
por exemplo:
is
verifica a identidade do objeto . Há apenas um objetoNone
; portanto, quando você faz issomy_var is None
, verifica se eles realmente são o mesmo objeto (não apenas objetos equivalentes )Em outras palavras,
==
é uma verificação de equivalência (que é definida de objeto para objeto), enquantois
verifica a identidade do objeto:fonte
is None
diferente== None
?__eq__
pode ser definido de qualquer forma, mas o comportamento deis
não pode ser alterado tão facilmente.is
". Depois de um comentário nas listas, ele mudou para "... mesmois
(mas apenas se você for louco)".object == None
na verdade, seja o idioma correto (embora eu não consiga pensar em nada de fora da minha cabeça). Você só precisa saber o que está fazendo.is
é geralmente preferido ao comparar objetos arbitrários a singletons,None
porque é mais rápido e previsível.is
sempre se compara à identidade do objeto, enquanto o que==
fará depende do tipo exato dos operandos e até da ordem deles.Esta recomendação é apoiada pelo PEP 8 , que declara explicitamente que "comparações com singletons como None devem sempre ser feitas com
is
ouis not
nunca com os operadores de igualdade".fonte
None
objeto sob o constante globalNone
. Se alguma coisa,NoneType
é um detalhe de implementação porque oNone
singleton deve ter algum tipo. (O fato de que você não pode criar instâncias desse tipo é uma boa indicação de que a sua uma instância está destinado a ser um singleton.)None
, por todos os meios utilizarobj == None
. Se você deseja verificar se um objeto éNone
, useobj is None
. O ponto da recomendação do PEP 8 (e desta resposta) é que a maioria das pessoas deseja a última quando deseja verificar Nenhuma, e também é mais rápido e mais claro.None
também é diferente dos objetos armazenados em cache, como0
outros inteiros pequenos, em que o cache é realmente um detalhe da implementação. A diferença é que um número inteiro tem valor intrínseco, que fornece suas propriedades e pode ser calculado. Por outro lado,None
não tem nenhum estado, é apenas a sua identidade que importa e o torna especial.O PEP 8 define que é melhor usar o
is
operador ao comparar singletons.fonte