Estoy haciendo un analizador de Python, y esto me confunde mucho:
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
¿Cómo funciona exactamente "in" en Python, con respecto a la asociatividad, etc.?
¿Por qué no hay dos de estas expresiones que se comporten de la misma manera?
python
syntax
python-2.x
usuario541686
fuente
fuente
if a < b < c:
y hacer que funcione de manera intuitivain
en un operador de "comparación". : \Respuestas:
1 in [] in 'a'
se evalúa como(1 in []) and ([] in 'a')
.Dado que la primera condición (
1 in []
) esFalse
, toda la condición se evalúa comoFalse
;([] in 'a')
nunca se evalúa realmente, por lo que no se genera ningún error.Aquí están las definiciones de las declaraciones:
fuente
[]
es falso, pero[]
no lo esFalse
, por ejemplo,[] and anything
devuelve[]
(noFalse
).Python hace cosas especiales con comparaciones encadenadas.
Los siguientes se evalúan de manera diferente:
Sin embargo, en ambos casos, si la primera comparación es
False
, no se examinará el resto de la declaración.Para tu caso particular,
También para demostrar la primera regla anterior, estas son declaraciones que se evalúan como Verdadero.
Prioridad de los operadores de Python: http://docs.python.org/reference/expressions.html#summary
fuente
De la documentación:
Lo que esto significa es que no hay asociatividad en
x in y in z
!Los siguientes son equivalentes:
fuente
La respuesta corta, dado que la larga ya se da varias veces aquí y de manera excelente, es que la expresión booleana está en cortocircuito , esto se ha detenido la evaluación cuando un cambio de verdadero en falso o viceversa no puede ocurrir mediante una evaluación adicional.
(ver http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Puede ser un poco corto (sin juego de palabras) como respuesta, pero como se mencionó, todas las demás explicaciones ya están bastante bien hechas aquí, pero pensé que el término merecía ser mencionado.
fuente