Quando eu estava procurando respostas para essa pergunta , descobri que não entendia minha própria resposta.
Eu realmente não entendo como isso está sendo analisado. Por que o segundo exemplo retorna Falso?
>>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
Obrigado por qualquer ajuda. Eu acho que devo estar perdendo algo realmente óbvio.
Eu acho que isso é sutilmente diferente do duplicado vinculado:
Por que a expressão 0 <0 == 0 retorna False em Python? .
Ambas as questões têm a ver com a compreensão humana da expressão. Parecia haver duas maneiras (na minha opinião) de avaliar a expressão. É claro que nenhum dos dois estava correto, mas no meu exemplo, a última interpretação é impossível.
Olhando para 0 < 0 == 0
você , você pode imaginar cada metade sendo avaliada e fazendo sentido como uma expressão:
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Portanto, o link responde por que isso avalia False
:
>>> 0 < 0 == 0
False
Mas com o meu exemplo 1 in ([1,0] == True)
não faz sentido como expressão, então, em vez de haver duas interpretações possíveis (reconhecidamente erradas), apenas uma parece possível:
>>> (1 in [1,0]) == True
fonte
==
ligações são mais apertadas do quein
, portanto,[1,0] == True
são avaliadas primeiro, depois o resultado disso é alimentado1 in other_result
.Respostas:
Python realmente aplica operador de comparação encadeado aqui. A expressão é traduzida para
o que é obviamente
False
.Isso também acontece para expressões como
que se traduz em
(sem avaliar
b
duas vezes).Veja a documentação da linguagem Python para mais detalhes.
fonte
1 in [1, 0] == [1, 0]
avalia paraTrue
.in
operador tivesse uma precedência mais alta do que outros operadores de comparação e que não estivesse em cadeia. Mas talvez esteja faltando um caso de uso.in
- apesar de tudox < y < z
faz sentido, mas não tanto comx in y in z
in
isso simplesmente não é mais o caso e o torna bastante contra-intuitivo.