operator python syntax operator-precedence

operator precedence python 3



¿Por qué(1 en[1,0]== Verdadero) se evalúa como Falso? (1)

Python en realidad aplica el encadenamiento de operador de comparación aquí. La expresión se traduce a

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

que obviamente es False

Esto también ocurre para expresiones como

a < b < c

que se traduce a

(a < b) and (b < c)

(sin evaluar b dos veces).

Consulte la documentación del lenguaje Python para obtener más detalles.

Esta pregunta ya tiene una respuesta aquí:

Cuando estaba buscando respuestas a esta pregunta , descubrí que no entendía mi propia respuesta.

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:

¿Por qué la expresión 0 <0 == 0 devuelve False en 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.

Mirando 0 < 0 == 0 podrías imaginar cada mitad siendo evaluada y teniendo sentido como expresión:

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

Entonces el enlace responde por qué esto evalúa False :

>>> 0 < 0 == 0 False

Pero con mi ejemplo 1 in ([1,0] == True) 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