2012-02-14 15 views
143

Cuando estaba buscando respuestas al this question, descubrí que no entendía mi propia respuesta.¿Por qué (1 en [1,0] == Verdadero) evaluar a Falso?

Realmente no entiendo cómo se está analizando esto. ¿Por qué el segundo ejemplo devuelve False?

>>> 1 in [1,0]    # This is expected 
True 
>>> 1 in [1,0] == True  # This is strange 
False 
>>> (1 in [1,0]) == True # This is what I wanted it to be 
True 
>>> 1 in ([1,0] == True) # But it's not just a precedence issue! 
          # It did not raise an exception on the second example. 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    1 in ([1,0] == True) 
TypeError: argument of type 'bool' is not iterable 

Gracias por cualquier ayuda. Creo que me debe estar perdiendo algo realmente obvio.


creo que esto es sutilmente diferente al duplicado vinculado:

Why does the expression 0 < 0 == 0 return False in Python?.

Ambas preguntas tienen que ver con la comprensión humana de la expresión. Parecía haber dos formas (en mi opinión) de evaluar la expresión. Por supuesto ninguno de los dos era correcto, pero en mi ejemplo, la última interpretación es imposible.

En cuanto a 0 < 0 == 0 que podía imaginar cada mitad se está evaluando y dar sentido como expresión:

>>> (0 < 0) == 0 
True 
>>> 0 < (0 == 0) 
True 

Así que los enlaces respuestas por qué esto evalúa False:

>>> 0 < 0 == 0 
False 

pero con mi ejemplo 1 in ([1,0] == True) doesn No tiene sentido como expresión, así que en lugar de que haya dos interpretaciones posibles (por cierto erróneas), solo una parece posible:

>>> (1 in [1,0]) == True 
+1

Precedente del operador ... el '==' se une más que 'in', entonces' [1,0] == True' se evalúa primero, luego el resultado de eso se alimenta a '1 en other_result'. –

+0

He eliminado la etiqueta Python-2.7, ya que Python 3.2 se comporta de la misma manera. – lvc

+1

@Marc B: no explica la segunda expresión –

Respuesta

180

Python realmente aplica el encadenamiento de operador de comparación aquí. La expresión se traduce al

(1 in [1, 0]) and ([1, 0] == True) 

que obviamente es False.

Esto también sucede por expresiones como

a < b < c 

que se traducen a

(a < b) and (b < c) 

(sin evaluar b dos veces).

Consulte el Python language documentation para obtener más información.

+34

Prueba adicional para esto, '1 in [1, 0] == [1, 0]' evalúa como 'True'. –

+0

'no 1 en [1,0] == Verdadero ... – ChessMaster

+8

Durante mucho tiempo he pensado en esto como una verruga del lenguaje. Hubiera preferido que el operador 'in' tenga una precedencia mayor que otros operadores de comparación y que no tenga cadena. Pero tal vez me falta un caso de uso. –

Cuestiones relacionadas