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.
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.
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".)
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.