Qual é a diferença entre "is None" e "== None"

324

Recentemente me deparei com essa sintaxe, não conheço a diferença.

Eu apreciaria se alguém pudesse me dizer a diferença.

myusuf3
fonte
1
Isso responde sua pergunta? Existe uma diferença entre "==" e "is"?
junho
Não está claro se esta pergunta é sobre isvs ==, ou sobre a natureza do que exatamente Noneé e como o comportamento difere em ambos os contextos (este último é o motivo pelo qual acabei aqui). Com base na imprecisão e falta de respostas do OP ... Estou surpreso que isso tenha muitos votos positivos. Quero dizer ... vamos lá ... a pergunta nem está escrita na pergunta real ...
RTbecard 22/01

Respostas:

291

A resposta é explicada aqui .

Citar:

Uma classe é livre para implementar a comparação da maneira que escolher, e pode optar por fazer a comparação com None significa alguma coisa (o que realmente faz sentido; se alguém lhe disser para implementar o objeto None a partir do zero, de que outra forma você poderia comparar True contra si mesmo?).

Na prática, não há muita diferença, pois os operadores de comparação personalizados são raros. Mas você deve usar is Nonecomo regra geral.

Ben Hoffstein
fonte
57
Além disso, is Noneé um pouco (~ 50%) mais rapidamente do que == None:)
Nas Banov
26
@ myusuf3: >>> timeit.Timer ('None is None'). timeit () | 0,225 | >>> timeit.Timer ('None == None'). timeit () | 0,328
Nas Banov
9
@ myusuf3 Você realmente não precisa de uma prova para isso. isé, basicamente, comparação de números inteiros, enquanto ==não está apenas resolvendo referências, mas comparando valores que podem ter tipos incompatíveis.
Pijusn
4
Um a favor de "é". Quando uma variável pode ser None ou algo que não tem comparação significativa com None. Por exemplo, uma variável pode ser um numpy.array ou None (meu caso particular).
Jblasco # 14/14
3
Gostaria de acrescentar ao que @TimLudwinski está dizendo: primeiro, se alguém optar por substituir o operador de igualdade para tornar None um caso especial, por que gostaríamos de dizer o contrário? Segundo, "deve haver uma - e preferencialmente apenas uma - maneira óbvia de fazê-lo". E a maneira óbvia de verificar se algo é igual a algo é, bem, o operador de igualdade.
Yuval
162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False
unutbu
fonte
56

Nesse caso, eles são os mesmos. Noneé um objeto singleton (existe apenas um None).

is verifica se o objeto é o mesmo objeto, enquanto == apenas verifica se são equivalentes.

Por exemplo:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Mas como existe apenas um None, eles sempre serão os mesmos e isretornarão Verdadeiro.

p = None
q = None
p is q # True because they are both pointing to the same "None"
Donald Miner
fonte
17
Esta resposta não está correta, conforme explicado na resposta de Ben Hoffstein abaixo stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonepode avaliar até Truemesmo se xnão for Nonesenão uma instância de alguma classe com seu próprio operador de igualdade personalizado.
max
5

Se você usa numpy,

if np.zeros(3)==None: pass

dará erro quando o numpy fizer uma comparação elementar

jf328
fonte
3

Depende do que você está comparando com Nenhum. Algumas classes têm métodos de comparação personalizados que tratam de maneira == Nonediferente is None.

Em particular, a saída de a == None nem precisa ser booleana !! - uma causa frequente de bugs.

Para um exemplo específico, ==use uma matriz numpy em que a comparação é implementada por elementos:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
PGlivi
fonte