2011-06-29 14 views
11

Vine aquí, donde "no Ninguno" es igual a True y False simultáneamente.Paradoja lógica en python?

>>> not None 
True 

>>> not None == True 
True 

>>> not None == False 
True 

Al principio me esperaba que esto sería debido a la orden de los operadores, pero sin embargo, al probar una expresión similar:

>>> not False 
True 

>>> not False == False 
False 

>>> not False == True 
True 

¿Puede alguien explicar por qué ocurre esto?

+0

Encontré [esta página] (http://docs.python.org/reference/expressions.html#summary) muy útil –

Respuesta

21

Este es debido a la precedencia del operador. not none == True significa not (None == True) significa None != True, que es verdadero. Del mismo modo, None != False también es cierto. El valor None es distinto de los booleanos.

Sus últimas dos expresiones significan False != False, que es falso, y False != True, que es verdadero.

+1

¡Estupendo! Entonces mi error no fue hacer _ (no ninguno) == ¿Verdad? –

+7

@Dog eat cat world: si. Pero luego, tenga en cuenta que '(not None) == True' es verdadero, mientras que' (no True) == None' es falso, ya que 'None! = False'. Para convertir un valor que puede ser 'None' en boolean, llame' bool' en él. –

4

Esto es de hecho debido a la precedencia del operador. not None == False se evaluará como not (None == False). None == False es False, lo que explica sus resultados.

Tal vez puedas probar:

>>> (not None) == True 
True 
>>> (not None) == False 
False 
2
>>> not None 
True 
>>> not None == True 
True 
>>> not None == False 
True 
>>> (not None) == True 
True 
>>> (not None) == False 
False 
2

Es el fin de la expansión. python las lee así

o>>> not (None == True) 
True 
>>> not (None == False) 
True 
>>> not False 
True 
>>> not (False == False) 
False 
>>> not (False == True) 
True 
>>> 

Creo que esto lo deja claro.