Python - это приоритет оператора ==

В 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
16
0
499
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь вы видите цепочка операторов, и никакого приоритета здесь нет!

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.

Документация здесь, см. Бит о цепочке.

Иногда очень полезно, но также появляется, когда вы меньше всего этого ожидаете!

Я думаю, что более полезным примером является их оригинальный запутанный код: a is None == b is None, который переводится как a is None and None == b and b is None. Если посмотреть с этой точки зрения, становится ясно, что в целом этот тест проходит только в том случае, если и a, и b являются None, а не если «Noneness» a совпадает с b (что и предполагал OP).

ShadowRanger 27.08.2018 22:10

Согласно документации, все операторы сравнения 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

Другие вопросы по теме