Si hago esto:
>>> False in [False, True]
True
Eso vuelve True
. Simplemente porque False
está 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
not
es 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 quenot
es 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; sinot
era 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 suFalse
lugar.not True
, estaría escribiendo algo comonot myfunc(x,y,z)
dóndemyfunc
está alguna función que regresaTrue
oFalse
.not x in y
se evalúa comox not in y
Puede 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 esFalse
claramente:En cambio, lo que quería expresar era
(not(True)) in [False, True]
lo que se esperabaTrue
, y puede ver por qué:fuente
dis
pero esta es una respuesta muy valiosa porque muestra que realmentenot in
se usaPrecedencia del operador.
in
se 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 (
in
es 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
True
está en la lista y devuelve el "no" del resultado.fuente
Está evaluando como
not True in [False, True]
, que regresaFalse
porqueTrue
está en[False, True]
Si intentas
Obtienes el resultado esperado.
fuente
Junto con las otras respuestas que mencionaron que la precedencia de
not
es 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 (
precedence
ochaining
) 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 True
eso 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
, comoTrue
es un elemento contenido en la lista.Por lo tanto,
not True in [False, True]
da el resultado "booleano opuesto"not
de la expresión anterior (sin paréntesis para preservar la precedencia, ya quein
tiene mayor precedencia que elnot
operador). Por lo tanto,not True
resultaráFalse
.Por otro lado,
(not True) in [False, True]
es igual aFalse in [False, True]
, que esTrue
(False
está 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 lanot
unió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é
4
porque
-(2)
es la misma que-2
. Los paréntesis no hacen absolutamente nada.not(True)
Es exactamente lo mismo.fuente