Se eu fizer isso:
>>> False in [False, True]
True
Isso retorna True
. Simplesmente porque False
está na lista.
Mas se eu fizer:
>>> not(True) in [False, True]
False
Isso retorna False
. Considerando que not(True)
é igual a False
:
>>> not(True)
False
Por quê?
python
python-2.7
python-3.x
Texom512
fonte
fonte
not(True) in [False, True]
Respostas:
Operador precedência 2.x , 3.xe . A precedência de
not
é menor que a dein
. Portanto, é equivalente a:Isso é o que você quer:
Como @Ben aponta: É recomendável nunca escrever
not(True)
, prefiranot True
. O primeiro faz com que pareça uma chamada de função, enquantonot
é um operador, não uma função.fonte
not(True)
; preferirnot True
. O primeiro faz com que pareça uma chamada de função, de onde veio sua confusão; senot
fosse uma função,not(True) in ...
não poderia sernot ((True) in ...)
. Você precisa saber que é um operador (ou acaba em situações como essa); portanto, você deve escrevê-lo como um operador, não disfarçar isso como uma função.a + b*c + d
, é muito ruim escrevera+b * c+d
. Então,not(True)
é ruim com essa medida também.not True
. Escreva em seuFalse
lugar.not True
, escreveria algo comonot myfunc(x,y,z)
ondemyfunc
está alguma função que retornaTrue
ouFalse
.not x in y
é avaliado comox not in y
Você pode ver exatamente o que está acontecendo desmontando o código. O primeiro caso funciona como o esperado:
O segundo caso, avalia para
True not in [False, True]
, que éFalse
claramente:O que você queria expressar era o
(not(True)) in [False, True]
que, como esperadoTrue
, e você pode ver o porquê:fonte
dis
mas esta é uma resposta muito valiosa, porque mostra que realmentenot in
é usadoOperador precedente.
in
vincula com mais força do quenot
, portanto, sua expressão é equivalente anot((True) in [False, True])
.fonte
É tudo sobre precedência do operador (
in
é mais forte quenot
). Mas pode ser facilmente corrigido adicionando parênteses no lugar certo:escrita:
é o mesmo que:
que parece se
True
está na lista e retorna o "não" do resultado.fonte
Ele está avaliando como
not True in [False, True]
, que retornaFalse
porqueTrue
está em[False, True]
Se você tentar
Você obtém o resultado esperado.
fonte
Juntamente com as outras respostas que mencionaram a precedência de,
not
é menor quein
, na verdade, sua declaração é equivalente a:Mas observe que, se você não separar sua condição das outras, o python usará duas funções (
precedence
ouchaining
) para separá-lo e, nesse caso, o python usou precedência. Além disso, observe que, se você quiser separar uma condição, precisará colocar toda a condição entre parênteses, não apenas o objeto ou o valor:Mas, como mencionado, há outra modificação do python nos operadores que está encadeando :
Com base na documentação do python :
Por exemplo, o resultado da seguinte instrução é
False
:Porque o python encadeará as instruções da seguinte maneira:
O que exatamente é
False and True
issoFalse
.Você pode assumir que o objeto central será compartilhado entre 2 operações e outros objetos (Falso neste caso).
E observe que também é válido para todas as comparações, incluindo testes de associação e operações de testes de identidade, que são os seguintes operandos:
Exemplo:
Outro exemplo famoso é o intervalo de números:
que é igual a:
fonte
Vamos vê-lo como uma operação de verificação de contenção de coleção:
[False, True]
é uma lista que contém alguns elementos.A expressão
True in [False, True]
retornaTrue
, comoTrue
é um elemento contido na lista.Portanto,
not True in [False, True]
fornece o "oposto booleano",not
resultado da expressão acima (sem parênteses para preservar a precedência, poisin
tem maior precedência que onot
operador). Portanto,not True
resultaráFalse
.Por outro lado
(not True) in [False, True]
,, é igual aFalse in [False, True]
, que éTrue
(False
está contido na lista).fonte
Para esclarecer algumas das outras respostas, adicionar parênteses após um operador unário não altera sua precedência.
not(True)
não faznot
vincular com mais forçaTrue
. É apenas um conjunto redundante de parêntesesTrue
. É quase o mesmo que(True) in [True, False]
. Os parênteses não fazem nada. Se você deseja que a ligação seja mais firme, é necessário colocar os parênteses em torno de toda a expressão, significando tanto o operador quanto o operando, ou seja(not True) in [True, False]
,.Para ver isso de outra maneira, considere
**
liga mais firmemente do que-
, e é por isso que você obtém o negativo de dois ao quadrado, e não o quadrado do negativo dois (que seria quatro positivo).E se você quisesse o quadrado dos dois negativos? Obviamente, você adicionaria parênteses:
No entanto, não é razoável esperar que o seguinte dê
4
porque
-(2)
é o mesmo que-2
. Os parênteses não fazem absolutamente nada.not(True)
é exatamente o mesmo.fonte