Comparação de cordas em Python: é vs. ==

Eu notei que um script Python que eu estava escrevendo estava agindo como um esquilo, e o rastreei até um loop infinito, onde a condição do loop era while line is not ''. Correndo através dele no depurador, descobri que essa linha era de fato ''. Quando eu a mudei para !=''' em vez de não é '', ela funcionou bem.

Além disso, é geralmente considerado melhor usar apenas '==' por padrão, mesmo quando se compara valores int ou Booleanos? I'sempre gostei de usar 'is' porque acho esteticamente mais agradável e pítonico (que é como eu caí nesta armadilha...), mas eu me pergunto se ele's pretende apenas ser reservado para quando você se importa em encontrar dois objetos com a mesma identificação.

Solução

Para todos os objetos Python embutidos (como cordas, listas, pictos, funções, etc.), se x é y, então x==y também é Verdade.

Nem sempre. O NaN é um contra-exemplo. Mas usualmente, a identidade (is) implica igualdade (==). O inverso não é verdade: Dois objetos distintos podem ter o mesmo valor.

Além disso, é geralmente considerado melhor usar apenas '==' por padrão, até ao comparar valores int ou Booleanos?

Você utiliza == ao comparar valores e is ao comparar identidades.

Quando se comparam ints (ou tipos imutáveis em geral), você quer quase sempre o primeiro. Há's uma otimização que permite que pequenos inteiros sejam comparados com 'is', mas don't confie nela.

Para valores booleanos, você não deve'não deve fazer comparações de forma alguma. Em vez de:

if x == True:
    # do something

escreva:

if x:
    # do something

Para comparar com Nenhum, é Nenhum é preferível a == Nenhum.

I'sempre gostei de usar 'is' porque acho esteticamente mais agradável e pythonic (que é como eu caí em esta armadilha...), mas pergunto-me se...#39;s destinado apenas a ser reservado para quando você se preocupa em encontrar dois objetos com a mesma identificação.

Sim, isso'é exactamente para isso's.

Comentários (18)

Eu gostaria de mostrar um pequeno exemplo de como is e === estão envolvidos em tipos imutáveis. Tente isso:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is compara dois objectos na memória, == compara os seus valores. Por exemplo, você pode ver que pequenos inteiros são armazenados em cache por Python:

c = 1
b = 1
>>> b is c
True

Você deve utilizar == ao comparar valores e is ao comparar identidades. (Também, de um ponto de vista inglês, "igual" é diferente de "is".)

Comentários (4)

Ver Esta pergunta.

A sua lógica de leitura

Para todos os objetos Python embutidos (como cordas, listas, pictos, funções, etc.), se x é y, então x==y também é Verdade.

é ligeiramente defeituoso.

Se is aplica-se então == será Verdadeiro, mas NÃO se aplica ao contrário. === pode render True enquanto is rende False.

Comentários (2)