Каковы правила связывания "==" и "! =" В 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

Кто-нибудь хотел бы объяснить мне, какие правила относятся к такой "цепочке" == (или !=)?

Большое спасибо.

Ответы

Ответ 1

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

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

Как правило, в соответствии с документацией, 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__ здраво).

Ответ 2

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

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

а

(2 == 2) == 2 похож на (True) == 2