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.
519
3
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.Você utiliza
==
ao comparar valores eis
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:
escreva:
Para comparar com
Nenhum
,é Nenhum
é preferível a== Nenhum
.Sim, isso'é exactamente para isso's.
Eu gostaria de mostrar um pequeno exemplo de como
is
e===
estão envolvidos em tipos imutáveis. Tente isso: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:Você deve utilizar
==
ao comparar valores eis
ao comparar identidades. (Também, de um ponto de vista inglês, "igual" é diferente de "is".)Ver Esta pergunta.
A sua lógica de leitura
é ligeiramente defeituoso.
Se
is
aplica-se então==
será Verdadeiro, mas NÃO se aplica ao contrário.===
pode render True enquantois
rende False.