В Python3
a = b = 3
a is None == b is None
возвращает False, но
(a is None) == (b is None)
возвращает True. Поэтому я предполагаю, основываясь только на этом примере, == имеет приоритет над является.
Однако,
a = b = None
a is None == b is None
возвращает True. И
(a is None) == (b is None)
возвращает True. Но
a is (None == b) is None
возвращает False. В этом случае может показаться, что является имеет приоритет над ==.
Приведу еще один пример, и это выражение не предназначено ни для чего, но потерпите меня, пожалуйста. Если я говорю
None is None == None
он возвращает True. Но оба следующих возвращают False.
None is (None == None)
(None is None) == None
Итак, очевидно, что Python не оценивает их со строгим приоритетом, но я не понимаю, что происходит. Как он оценивает это выражение с помощью двух разных операторов, но по-разному в любом порядке?






Здесь вы видите цепочка операторов, и никакого приоритета здесь нет!
Python поддерживает такие выражения, как
1 < a < 3
Проверить, находится ли число от 1 до 3; он равен (1 < a) and (a < 3), за исключением того, что a оценивается только один раз.
К сожалению, это также означает, что, например,
None is None == None
на самом деле означает
(None is None) and (None == None)
что, конечно, верно, и более длинный пример, с которого вы начали
a = b = 3
a is None == b is None
означает
(a is None) and (None == b) and (b is None)
который может быть только True, если и a, и b являются None.
Документация здесь, см. Бит о цепочке.
Иногда очень полезно, но также появляется, когда вы меньше всего этого ожидаете!
Согласно документации, все операторы сравнения Python имеют одинаковый приоритет:
There are eight comparison operations in Python. They all have the same priority (which is higher than that of the Boolean operations).
Однако, заключая сравнения в скобки, они начинают быть выражения атомов, поэтому утверждения в скобках оцениваются перед операторами снаружи, что влияет на порядок вычисления, я разложу первый «противоречивый» случай, все остальные аналогичны:
a = b = 3
a is None == b is None
В документации приоритет тот же, поэтому оценка следующая:
1. a is None ? -> False # Because a == 3
2. False == b -> False # Because b == 3
3. False is None
Пожалуйста, смотрите порядок второго корпуса ниже:
(a is None) == (b is None)
1. a is None ? -> False # Because a == 3
2. b is None -> False # Because b == 3
3. False is False -> True
Я думаю, что более полезным примером является их оригинальный запутанный код:
a is None == b is None, который переводится какa is None and None == b and b is None. Если посмотреть с этой точки зрения, становится ясно, что в целом этот тест проходит только в том случае, если иa, иbявляютсяNone, а не если «Noneness»aсовпадает сb(что и предполагал OP).