Estou fazendo um analisador Python, e isso está realmente me confundindo:
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
Como exatamente "in" funciona em Python, em relação à associatividade, etc.?
Por que duas dessas expressões não se comportam da mesma maneira?
python
syntax
python-2.x
user541686
fonte
fonte
if a < b < c:
e trabalhe intuitivamentein
um operador de "comparação", acho. : \Respostas:
1 in [] in 'a'
é avaliado como(1 in []) and ([] in 'a')
.Como a primeira condição (
1 in []
) éFalse
, toda a condição é avaliada comoFalse
;([] in 'a')
nunca é realmente avaliado, portanto, nenhum erro é gerado.Aqui estão as definições das declarações:
fonte
[]
é falso, mas[]
não éFalse
, por exemplo,[] and anything
retorna[]
(nãoFalse
).Python faz coisas especiais com comparações encadeadas.
Os itens a seguir são avaliados de forma diferente:
Em ambos os casos, se a primeira comparação for
False
, o resto da instrução não será analisado.Para o seu caso particular,
Também para demonstrar a primeira regra acima, essas são declarações avaliadas como True.
Precedência de operadores Python: http://docs.python.org/reference/expressions.html#summary
fonte
Da documentação:
O que isso significa é que não há associatividade em
x in y in z
!Os seguintes são equivalentes:
fonte
A resposta curta, uma vez que a longa já é dada várias vezes aqui e de maneiras excelentes, é que a expressão booleana está em curto-circuito , isto é interrompido a avaliação quando uma mudança de verdadeiro para falso ou vice-versa não pode acontecer por avaliação posterior.
(consulte http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Pode ser um pouco curto (sem trocadilhos) como resposta, mas como mencionei, todas as outras explicações já foram feitas muito bem aqui, mas achei que o termo merecia ser mencionado.
fonte