2011-05-23 10 views
31

La comparación de valores booleanos con == funciona en Python. Pero cuando aplico el not operador booleano, el resultado es un error de sintaxis:¿Por qué 'verdadero == no es falso' un error de sintaxis en Python?

Python 2.7 (r27:82500, Sep 16 2010, 18:02:00) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> True == True 
True 
>>> False == False 
True 
>>> True is not False 
True 
>>> True == not False 
    File "<stdin>", line 1 
    True == not False 
      ^
SyntaxError: invalid syntax 
>>> 

Por qué es un error de sintaxis? Esperaría que not False sea una expresión que devuelva un valor booleano, y True == <x> para que sea una sintaxis válida siempre que <x> sea una expresión con sintaxis válida.

+7

Tenga en cuenta que "True is not false" is * not * lo mismo que "True is (not false)". "is not" es un operador distinto, que significa "no es idéntico a", mientras que "True is (false)" dice "True es idéntico a la negación booleana de False". Solo un comentario, porque tu ejemplo parece, como si supieras, que ambos son lo mismo. – lunaryorn

+0

'True == not' es el error de sintaxis real, cualquier cosa después de eso es irrelevante. – dansalmo

+2

Y para el registro, esto falla para ** cualquier ** operador de comparación más 'no', ** independientemente de los tipos comparados **. 'True no 'False'',' 3.3> = not 4.5', '{} no es []', 'set() == not None' y 'slice()! = not lambda: x' ** all ** levanta el mismo error de sintaxis. Esto no está limitado a '== no' y booleanos. –

Respuesta

45

Tiene que ver con operator precedence in Python (el intérprete cree que está comparando la opción Verdadera a no, ya que == tiene una precedencia mayor que not). Es necesario aclarar algunos paréntesis, a la orden de las operaciones:

True == (not False) 

En general, no se puede utilizar not en el lado derecho de una comparación sin paréntesis. Sin embargo, no puedo pensar en una situación en la que alguna vez necesite usar un not en el lado derecho de una comparación.

+1

¿Hay alguna razón para la precedencia del operador o es simplemente una "característica" tonta? –

+0

Wow; esto es interesante. No puedo pensar en ningún otro idioma que conozca donde la negación tenga tan baja precedencia, ¡ciertamente no más baja que la igualdad! – verdesmarald

+0

@Jim: Históricamente y especialmente viniendo de las matemáticas, la mayoría de los operadores de lenguajes de programación son principalmente arbitrarios. Al menos más allá de la suma y la multiplicación. – Joey

10

Es solo una cuestión de precedencia del operador.

Probar:

>>> True == (not False) 
True 

Tener una mirada en this table of operator precedences, usted encontrará que se une == Tigher que not, y por lo tanto True == not False se analiza como (True == not) False que es claramente un error.

1

Creo que lo que estás buscando es "y no". Esto te da los resultados que estás buscando. Si comparas booleanos, lo que tienes es una expresión booleana compuesta, aquí hay un sitio web de ejemplo Compound Boolean Expression.

>>> True and True 
True 
>>> True and not True 
False 
>>> True and not False 
True 
>>> False and not True 
False 
>>> False and not False 
False 
>>> False and False 
False 
Cuestiones relacionadas