Вопрос или проблема
Почему (2>3 == False) ложно, а ((2>3) == False) истинно [дубликат]
Я пробовал
print (2>3 == False)
с результатом
False
и
print ((2>3) == False)
с результатом
True
приоритизация равна. так что оцениваем слева направо, присваивание справа налево.
может быть, это проблема цепочки (2>3) and (3==False)
?
Это из-за операторов цепного сравнения в Python. В принципе
2 > 3 == False
то же самое, что и:
(2 > 3) and (3 == False) # False и False
Как и то, что
1 < 2 < 3
то же самое, что и
(1 < 2) and (2 < 3)
Ответ или решение
Вопрос заключается в том, почему выражение (2 > 3 == False)
возвращает False
, а ((2 > 3) == False)
возвращает True
. Давайте разберем это по шагам.
1. Приоритет операций и цепочные сравнения
В Python оператор >
и оператор ==
имеют одинаковый уровень приоритета, однако, когда мы используем цепные сравнения (chain comparisons), они интерпретируются по-другому.
Выражение 2 > 3 == False
в Python интерпретируется как (2 > 3) and (3 == False)
. Это означает, что Python сначала проверяет, является ли 2 больше 3 (что, конечно, не так), а затем проверяет, равен ли 3 значению False
.
2. Оценка выражений
Теперь давайте оценим каждую часть:
2 > 3
: Это выражение возвращаетFalse
, так как 2 не больше 3.3 == False
: Это выражение также возвращаетFalse
, поскольку в Python значениеFalse
соответствует числу 0, а 3 не равно 0.
Следовательно, выражение (2 > 3) and (3 == False)
становится False and False
, что приводит к итогу False
.
3. Разбор второго выражения
Теперь рассмотрим второе выражение: ((2 > 3) == False)
.
Здесь мы сначала вычисляем 2 > 3
, что, как уже отмечалось, возвращает False
. Далее мы сравниваем это значение с False
:
False == False
: Это выражение возвращаетTrue
, так как обе стороны равны.
Выводы
(2 > 3 == False)
возвращаетFalse
, потому что оно эквивалентно(2 > 3) and (3 == False)
, и обе части равныFalse
.((2 > 3) == False)
возвращаетTrue
, так как оно сравниваетFalse
сFalse
.
Таким образом, ключевым моментом является то, что в первой записи происходит логическое "и" (and) между двумя сравнениями, а во второй – простое сравнение одного значения с булевым (True
или False
). Это и объясняет различие в результатах.