2012-03-27 15 views
8

He tropezado recientemente sobre esta expresión:¿Cómo funciona el enlace del operador en este ejemplo de Python?

True == False in (False,) 

se evalúa como False, pero no entiendo por qué. True == False es False y False in (False,) es True, por lo tanto (me) posibilidades plausibles

True == (False in (False,)) 

y

(True == False) in (False,) 

evaluar a True, como me hubiera esperado. ¿Qué está mal aquí?

+7

posible duplicado de [¿Por qué (1 en \ [1,0 \] == Verdadero) evaluar a Falso?] (Http://stackoverflow.com/questions/9284350/why-does-1-in-1 -0-true-evaluate-to-false) – agf

Respuesta

9

Creo que este es un caso de esquina del encadenamiento de operador de comparación de Python. Se expande a

(True == False) and (False in (False,)) 

que evalúa a False.

Este comportamiento fue pensado para que coincida con la notación matemática convencional (por ejemplo x == y == z lo que significa que los tres son iguales, o 0 <= x < 10 significa x está en el intervalo [0, 10)). Pero in es también un operador de comparación, dando el comportamiento inesperado.

+0

¿Tiene esto sentido en Python, porque puedo ver lo que está sucediendo pero el operador en tiene una función completamente diferente a == entonces, ¿por qué sufre este encadenamiento de operador de comparación? – jamylak

+0

'in' es como los otros en que mira dos valores y devuelve un bool, de acuerdo con la relación entre los dos valores. –

+1

Además, es útil tener en cuenta que esta expresión es quivalente a 'False and True' que evaluará a' False', debido a [evaluación de corto circuito] (http://en.wikipedia.org/wiki/Short- circuit_evaluation). –

Cuestiones relacionadas