Junto con las otras respuestas que mencionaron que la precedencia de not
es menor que in
, en realidad su declaración es equivalente a:
not (True in [False, True])
Pero tenga en cuenta que si no separa su condición de las otras, python usará 2 roles ( precedence
o chaining
) 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:
(not True) in [False, True]
Pero como se mencionó, hay otra modificación por python en los operadores que está encadenando :
Basado en la documentación de Python :
Tenga en cuenta que las comparaciones, las pruebas de membresía y las pruebas de identidad tienen la misma prioridad y tienen una función de encadenamiento de izquierda a derecha como se describe en la sección Comparaciones.
Por ejemplo, el resultado de la siguiente declaración es False
:
>>> True == False in [False, True]
False
Porque python encadenará las declaraciones de la siguiente manera:
(True == False) and (False in [False, True])
Que es exactamente False and True
eso es False
.
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:
in, not in, is, is not, <, <=, >, >=, !=, ==
Ejemplo:
>>> 1 in [1,2] == True
False
Otro ejemplo famoso es el rango de números:
7<x<20
que es igual a:
7<x and x<20