Existe alguma diferença entre "foo é None" e "foo == None"?

votos
207

Existe alguma diferença entre:

if foo is None: pass

e

if foo == None: pass

A convenção que eu já vi em mais de código Python (e o código de me escrever) é o primeiro, mas eu vim recentemente através de código que usa o último. Nenhum é uma instância (ea única instância, IIRC) de NoneType, por isso não importa, certo? Existem quaisquer circunstâncias em que pode?

Publicado 25/08/2008 em 19:27
fonte usuário
Em outras línguas...                            


12 respostas

votos
239

issempre retorna Truese compara a mesma instância do objeto

Considerando que ==é em última análise determinada pelo __eq__()método

ou seja


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False
Respondeu 25/08/2008 em 19:38
fonte usuário

votos
47

Você pode querer ler este identidade de objeto e equivalência .

A declaração 'é' é usado para a identidade do objeto, ele verifica se os objetos se referem à mesma instância (mesmo endereço na memória).

E a declaração do '==' refere-se a igualdade (mesmo valor).

Respondeu 25/08/2008 em 19:48
fonte usuário

votos
24

Uma palavra de cautela:

if foo:
  # do something

É não exatamente o mesmo que:

if x is not None:
  # do something

O primeiro é um teste de valor booleano e pode ser avaliada como falsa em diferentes contextos. Há um certo número de coisas que representam falso em alguns testes valor booleano por exemplo recipientes vazios, valores booleanos. Nenhum também avalia como false nesta situação, mas outras coisas fazem também.

Respondeu 26/08/2008 em 14:44
fonte usuário

votos
12

(ob1 is ob2) igual a (id(ob1) == id(ob2))

Respondeu 25/02/2009 em 11:34
fonte usuário

votos
11

A razão foo is Noneé a forma preferida é que você pode estar lidando com um objeto que define o seu próprio __eq__, e que define o objeto a ser igual a Nenhum. Então, use sempre foo is Nonese você precisa ver se ele é de facto None.

Respondeu 28/05/2010 em 22:15
fonte usuário

votos
8

Não há nenhuma diferença porque os objetos que são vontade idêntica, naturalmente, ser igual. No entanto, PEP 8 afirma claramente que você deve usar is:

Comparações com singletons, como None deve sempre ser feito com é ou não é, nunca os operadores de igualdade.

Respondeu 19/05/2013 em 16:35
fonte usuário

votos
5

istestes de identidade, não a igualdade. Para sua declaração foo is none, Python simplesmente compara o endereço de memória de objetos. Isso significa que você está fazendo a pergunta "Eu tenho dois nomes para o mesmo objeto?"

==nos outros ensaios de mão para a igualdade, tal como determinado pelo __eq__()método. Ele não se preocupa com identidade.

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

Noneé um operador Singleton. Então None is Nonesempre é verdade.

In [101]: None is None
Out[101]: True
Respondeu 19/12/2014 em 04:05
fonte usuário

votos
4

@ Jason :

Eu recomendo usar algo mais ao longo das linhas de

if foo:
    #foo isn't None
else:
    #foo is None

Eu não gosto de usar "se foo:" a menos que foo representa verdadeiramente um valor booleano (ou seja, 0 ou 1). Se foo é uma string ou um objeto ou qualquer outra coisa, "se foo:" pode funcionar, mas parece que um atalho preguiçoso para mim. Se você está verificando para ver se x é None, dizer "se x é None:".

Respondeu 25/08/2008 em 22:35
fonte usuário

votos
4

Para Nenhum não deve haver uma diferença entre a igualdade (==) e identidade (é). O NoneType provavelmente retorna identidade para a igualdade. Uma vez que nenhum é o único exemplo que você pode fazer de NoneType (acho que isso é verdade), as duas operações são as mesmas. No caso de outros tipos isso nem sempre é o caso. Por exemplo:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

Isso iria imprimir "Equal" desde listas têm uma operação de comparação que não é o padrão de retornar de identidade.

Respondeu 25/08/2008 em 20:04
fonte usuário

votos
2

Mais alguns detalhes:

  1. A iscláusula de fato verifica se os dois objects estão no mesmo local de memória ou não. ou seja, se ambos apontam para o mesmo local de memória e têm o mesmo id.

  2. Como uma consequência de uma, isassegura se, ou não, as duas lexicamente representados objects têm atributos idênticos (atributos-de-atributos ...) ou não

  3. Instanciação de tipos primitivos, como bool, int, string(com algumas excepções), NoneTypetendo um mesmo valor será sempre no mesmo local de memória.

Por exemplo

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

E uma vez que NoneTypesó pode ter uma instância de si mesmo na mesa do python "look-up", portanto, o primeiro eo último são mais de um estilo de programação do desenvolvedor que escreveu o código (talvez para a consistência) em vez de ter qualquer razão lógica sutil para escolher um sobre o outro.

Respondeu 19/05/2013 em 16:08
fonte usuário

votos
1

A conclusão de John Machin que Noneé um singleton é uma conclusão reforçada por este código.

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

Desde Noneé um singleton, x == Nonee x is Noneteria o mesmo resultado. No entanto, na minha opinião estética, x == Noneé o melhor.

Respondeu 27/03/2011 em 20:31
fonte usuário

votos
0
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
Respondeu 03/04/2019 em 07:11
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more