Это меня озадачивает. Даже не зная порядка приоритета, можно проверить, что два возможных способа собрать выражение дадут False:
>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False
Но
>>> 0 is 0 == 0
True
Как получилось?
Ответ 1
При привязке операторов сравнения в Python операторы фактически не применяются к результату других операторов, а применяются к операндам индивидуально. Это x ? y ?? z (где ? и ?? должны находиться в состоянии для некоторых операторов сравнения) не эквивалентно (x ? y) ?? z и x ? (y ?? z), а скорее x ? y and y ?? z.
Это особенно полезно для > и co., позволяя писать такие вещи, как min < x < max, и делать то, что вам нужно, а не сравнивать логические числа с числом (что произойдет на большинстве других языков).
Ответ 2
Вы используете цепочку операторов сравнения. Выражение интерпретируется как:
Сравнение может быть скопировано произвольно, например, x < y <= z эквивалентно x < y and y <= z, за исключением того, что y оценивается только один раз (но в обоих случаях z вообще не оценивается при обнаружении x < y быть ложным).
0 is 0 истинно, потому что Python interns small integers, деталь реализации, поэтому вы получаете (True) and (True), производя True.