0 равно 0 == 0 (# означает значение True?)
Это меня озадачивает. Даже не зная порядка приоритета, можно проверить, что два возможных способа собрать выражение дадут 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
Вы используете цепочку операторов сравнения. Выражение интерпретируется как:
(0 is 0) and (0 == 0)
Из Сравнительная документация:
Сравнение может быть скопировано произвольно, например, x < y <= z
эквивалентно x < y and y <= z
, за исключением того, что y
оценивается только один раз (но в обоих случаях z
вообще не оценивается при обнаружении x < y
быть ложным).
0 is 0
истинно, потому что Python interns small integers, деталь реализации, поэтому вы получаете (True) and (True)
, производя True
.