2012-06-22 2 views
15

Сегодня утром, я считаю себя писать что-то вроде:Каковы правила, касающиеся цепное «==» и в Python

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

И был удивлен, что он дал мне ожидаемый результат.

Я думал, что это будет вести себя, как:

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

Но это явно не так. Кажется, что Python рассматривает первое утверждение иначе, чем второе, что приятно, но я не мог найти никакой документации или объяснений по этому поводу.

Я проверил и получил это:

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

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

ли кто-то уход объяснить мне, что правила, касающиеся такой «цепочки» из == (или !=)?

спасибо.

+3

Формально, если a, b, c, ..., y, z являются выражениями и op1, op2, ..., opN являются операторами сравнения, то op1 b op2 c ... y opN z эквивалентно a op1 b и b op2 c и ... y opN z, за исключением того, что каждое выражение оценивается не более одного раза. @ http://docs.python.org/reference/expressions.html – georg

+2

Аккуратно, а? Вы также можете сделать 'a Thomas

+0

Не то, чтобы мне было очень много, но может ли downvoter объяснить, почему он отказался? – ereOn

ответ

24

Это работает со всеми операторами сравнения - например, вы также можете сделать:

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

В общем, according to the documentation, a op1 b op2 c где op1 и op2 являются любыми: <, >, !=, ==, <=, >=, is, is not, in или not in даст тот же результат, как:

a op1 b and b op2 c 

Документы также сказать, что это может работать со сколь угодно большим количеством сравнений, поэтому:

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

Это может быть немного запутанный результат, поскольку он кажется, 5 != (3+2) - каждый операнд сравнивается только с теми, которые непосредственно примыкают к нему, а не делает все возможные комбинации (что может быть неясно из примеров, используя только ==, так как это не повлияет на ответ, если все определяет __eq__ sanely).

+0

Также работает для 'in' и' not in', например.'4 в [4] в [[4]]' (не то, что я рекомендую это использование ...) – interjay

+0

@interjay действительно, и я фактически редактировал их в свой ответ, когда появился ваш комментарий. GMTA. :-) – lvc

+1

Спасибо за объяснения. Моя любовь к этому языку растет изо дня в день! ;) – ereOn

12

Насколько я знаю пример, вы отмечаете не сцепление.

2 == 2 == 2, как (2 == 2) and (2 == 2) который оказывается True and True

в то время как

(2 == 2) == 2, как (True) == 2

Смежные вопросы