Короткий ответ
Все три выражения вернут 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, а не вычисляются по одному слева направо. - Ставь скобки. В сомнительных случаях явно группируй подвыражения, чтобы результат не зависел от неочевидного синтаксиса.
- Без булевых литералов. Не сравнивай результат с
TrueилиFalse— пиши простоif x > 0.
Подводные камни
- Иллюзия истинности. Интуитивное чтение слева направо подводит:
11 > 0истинно, но дальше выполняется проверка0 is True, а не сравнение с промежуточным итогом. - Скрытая конъюнкция. Средний операнд сравнивается дважды, из-за чего появляются неожиданные проверки вроде
range(2) == True. - Смешение is и ==. В цепочке
isпроверяет идентичность объектов:0 is Trueложно, хотя сравнение0 == Falseв Python истинно.
Как отвечать на собеседовании
- Сразу ответь: все три выражения дают
False→ объясни правило цепочечных сравненийa op1 b op2 cравно(a op1 b) and (b op2 c)→ разбери каждое выражение по частям → покажи, что скобки(11 > 0) is Trueменяют результат наTrue.