2012-06-22 12 views
15

Esta mañana, me encuentro escribiendo algo como:¿Cuáles son las normas relativas encadenamiento de "==" y en Python

if (a == b == c): 
    # do something 

Y sorprendió que me dio el resultado esperado.

pensé que sería comportarse como:

if ((a == b) == c): 
    # do something 

Pero es obvio que no lo hizo. Parece que Python está tratando la primera declaración de forma diferente a la segunda, lo cual es bueno, pero no pude encontrar ninguna documentación o explicación al respecto.

He probado y tiene la siguiente:

In [1]: 2 == 2 == 2 
Out[1]: True 

In [2]: (2 == 2) == 2 
Out[2]: False 

le importaría que alguien me explique cuáles son las normas relativas a tal "encadenamiento" de == (o !=)?

Muchas gracias.

+3

Formalmente, si a, b, c, ..., y, z son expresiones y op1, op2, ..., opN son operadores de comparación, entonces op1 b op2 c ... y opN z es equivalente a a op1 b y b op2 c y ... y opN z, excepto que cada expresión se evalúa como máximo una vez. @ http://docs.python.org/reference/expressions.html – georg

+2

Limpio, ¿eh? También puede hacer 'a Thomas

+0

No es que me preocupe demasiado, pero ¿puede el infractor explicar por qué bajó la votación? – ereOn

Respuesta

24

Esto funciona con todos los operadores de comparación - por ejemplo, también se puede hacer:

>>> 4 < 5 < 6 
True 
>>> 4 < 5 !=2 
True 

En general, according to the documentation, a op1 b op2 c donde op1 y op2 son cualquiera de: <, >, !=, ==, <=, >=, is, is not, in o not in dará el mismo resultado que:

a op1 b and b op2 c 

Los documentos también dicen que esta puede trabajar con muchas comparaciones de manera arbitraria, por lo que:

>>> 5 != '5' != 'five' != (3+2) 
True 

que puede ser un resultado ligeramente confuso, ya que a veces parece decir 5 != (3+2) - cada operando solo se compara con los que están inmediatamente adyacentes, en lugar de hacer todas las combinaciones posibles (lo que podría no estar claro en los ejemplos que usan solo ==, ya que no afectará la respuesta si todo define __eq__)

+0

También funciona para 'in' y' not in', p. Ej.'4 en [4] en [[4]]' (no es que recomiendo este uso ...) – interjay

+0

@interjay de hecho y en realidad estaba editando esos en mi respuesta cuando apareció tu comentario. GMTA. :-) – lvc

+1

Muchas gracias por las explicaciones. ¡Mi amor por este idioma crece día a día! ;) – ereOn

12

Por lo que yo sé el ejemplo usted señala no está encadenando.

2 == 2 == 2 es como (2 == 2) and (2 == 2), que resulta ser True and True

mientras

(2 == 2) == 2 es como (True) == 2

Cuestiones relacionadas