Cuando estaba buscando respuestas a esta pregunta , descubrí que no entendía mi propia respuesta.
Realmente no entiendo cómo se analiza 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 estoy 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 era correcto, pero en mi ejemplo, la última interpretación es imposible.
Mirándote 0 < 0 == 0
podrías imaginar que cada mitad es evaluada y tiene sentido como una 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 una expresión, por lo que en lugar de haber dos interpretaciones posibles (ciertamente erróneas), solo una parece posible:
>>> (1 in [1,0]) == True
fuente
==
unión es más fuerte quein
, por lo que[1,0] == True
primero se evalúa, luego el resultado de eso se alimenta a1 in other_result
.Respuestas:
Python realmente aplica el operador de comparación encadenado aquí. La expresión se traduce a
que es obviamente
False
.Esto también sucede para expresiones como
que se traducen en
(sin evaluar
b
dos veces).Consulte la documentación del lenguaje Python para más detalles.
fuente
1 in [1, 0] == [1, 0]
evalúa aTrue
.in
operador tenga una mayor prioridad que otros operadores de comparación y que no se encadene. Pero tal vez me falta un caso de uso.in
- después de todox < y < z
tiene sentido, pero no tanto conx in y in z
in
esto simplemente ya no es el caso y lo hace bastante contra-intuitivo.