Si hago esto:
>>> False in [False, True]
True
Eso vuelve True. Simplemente porque Falseestá en la lista.
Pero si lo hago:
>>> not(True) in [False, True]
False
Eso vuelve False. Mientras que not(True)es igual a False:
>>> not(True)
False
¿Por qué?
python
python-2.7
python-3.x
Texom512
fuente
fuente

not(True) in [False, True]Respuestas:
Operador de precedencia 2.x , 3.x . La precedencia de
notes menor que la dein. Entonces es equivalente a:Esto es lo que quieres:
Como señala @Ben: se recomienda nunca escribir
not(True), prefieranot True. El primero hace que parezca una llamada de función, mientras quenotes un operador, no una función.fuente
not(True); prefierennot True. El primero hace que parezca una llamada a función, que es de donde proviene su confusión; sinotera una función, entoncesnot(True) in ...no podría serlonot ((True) in ...). Debes saber que es un operador (o terminas en situaciones como esta), por lo que debes escribirlo como un operador, no disfrazarlo como una función.a + b*c + d, es muy malo escribira+b * c+d. Tambiénnot(True)es malo por esa medida también.not True. Escribe en suFalselugar.not True, estaría escribiendo algo comonot myfunc(x,y,z)dóndemyfuncestá alguna función que regresaTrueoFalse.not x in yse evalúa comox not in yPuede ver exactamente lo que está sucediendo desmontando el código. El primer caso funciona como espera:
El segundo caso, evalúa a
True not in [False, True], que esFalseclaramente:En cambio, lo que quería expresar era
(not(True)) in [False, True]lo que se esperabaTrue, y puede ver por qué:fuente
dispero esta es una respuesta muy valiosa porque muestra que realmentenot inse usaPrecedencia del operador.
inse une más fuerte quenot, por lo que su expresión es equivalente anot((True) in [False, True]).fuente
Se trata de la precedencia del operador (
ines más fuerte quenot). Pero se puede corregir fácilmente agregando paréntesis en el lugar correcto:escritura:
es lo mismo que:
que se ve si
Trueestá en la lista y devuelve el "no" del resultado.fuente
Está evaluando como
not True in [False, True], que regresaFalseporqueTrueestá en[False, True]Si intentas
Obtienes el resultado esperado.
fuente
Junto con las otras respuestas que mencionaron que la precedencia de
notes menor quein, en realidad su declaración es equivalente a:Pero tenga en cuenta que si no separa su condición de las otras, python usará 2 roles (
precedenceochaining) para separar eso, y en este caso python utilizó la precedencia. Además, tenga en cuenta que si desea separar una condición, debe poner todas las condiciones entre paréntesis, no solo el objeto o valor:Pero como se mencionó, hay otra modificación por python en los operadores que está encadenando :
Basado en la documentación de Python :
Por ejemplo, el resultado de la siguiente declaración es
False:Porque python encadenará las declaraciones de la siguiente manera:
Que es exactamente
False and Trueeso esFalse.Puede suponer que el objeto central se compartirá entre 2 operaciones y otros objetos (falso en este caso).
Y tenga en cuenta que también es cierto para todas las comparaciones, incluidas las pruebas de membresía y las operaciones de pruebas de identidad que son los siguientes operandos:
Ejemplo:
Otro ejemplo famoso es el rango de números:
que es igual a:
fuente
Veámoslo como una operación de comprobación de la contención de la colección:
[False, True]es una lista que contiene algunos elementos.La expresión
True in [False, True]regresaTrue, comoTruees un elemento contenido en la lista.Por lo tanto,
not True in [False, True]da el resultado "booleano opuesto"notde la expresión anterior (sin paréntesis para preservar la precedencia, ya queintiene mayor precedencia que elnotoperador). Por lo tanto,not TrueresultaráFalse.Por otro lado,
(not True) in [False, True]es igual aFalse in [False, True], que esTrue(Falseestá contenido en la lista).fuente
Para aclarar algunas de las otras respuestas, agregar paréntesis después de un operador unario no cambia su precedencia.
not(True)No hace que lanotunión sea más fuerteTrue. Es solo un conjunto redundante de paréntesisTrue. Es casi lo mismo que(True) in [True, False]. Los paréntesis no hacen nada. Si desea que el enlace sea más ajustado, debe poner los paréntesis alrededor de toda la expresión, es decir, tanto el operador como el operando, es decir,(not True) in [True, False].Para ver esto de otra manera, considere
**se une más fuerte que-, por lo que obtienes el negativo de dos al cuadrado, no el cuadrado de dos negativos (que sería positivo cuatro).¿Qué pasaría si quisieras el cuadrado de dos negativos? Obviamente, agregarías paréntesis:
Sin embargo, no es razonable esperar que lo siguiente dé
4porque
-(2)es la misma que-2. Los paréntesis no hacen absolutamente nada.not(True)Es exactamente lo mismo.fuente