Каковы правила связывания "==" и "! =" В 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
Ответ 3
Отметьте здесь: http://docs.python.org/reference/expressions.html#not-in