Подтвердить что ты не робот

0 равно 0 == 0 (# означает значение True?)

Это меня озадачивает. Даже не зная порядка приоритета, можно проверить, что два возможных способа собрать выражение дадут False:

>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False

Но

>>> 0 is 0 == 0
True

Как получилось?

4b9b3361

Ответ 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.