Короткий ответ
Все три выражения вернут False, хотя на первый взгляд кажутся истинными. Причина — цепочечные сравнения: выражение вида a op1 b op2 c раскрывается в (a op1 b) and (b op2 c).
Как это работает подробнее
Выражение читается не как последовательность независимых операций, а как логическая конъюнкция, в которой средний операнд участвует дважды.
- Первое выражение.
11 > 0 is Trueэквивалентно(11 > 0) and (0 is True): первая часть истинна, но0 is Trueложно, ведь это разные объекты. - Второе выражение.
0 < 0 == 0разворачивается в(0 < 0) and (0 == 0); первое сравнение ложно, поэтому ложно всё выражение. - Третье выражение.
1 in range(2) == True— это(1 in range(2)) and (range(2) == True): вхождение истинно, но сравнение объектаrangeсTrueложно. - Сила скобок. Явные скобки меняют результат:
(11 > 0) is TrueвернётTrue, так как сначала вычисляется сравнение, а затем проверяется его результат.
Пример кода
Цепочечные сравнения и скобки
print(11 > 0 is True) # False
print(0 < 0 == 0) # False
print(1 in range(2) == True) # False
print((11 > 0) is True) # True — скобки меняют смыслЧто использовать на практике
- Читай по правилам. Помни, что сравнения в Python выстраиваются в цепочку через неявное
and, а не вычисляются по одному слева направо. - Ставь скобки. В сомнительных случаях явно группируй подвыражения, чтобы результат не зависел от неочевидного синтаксиса.