Python - это == приоритет оператора - программирование

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 не оценивает их с некоторым строгим приоритетом, но я запутался в том, что происходит. Как он оценивает это выражение с помощью двух разных операторов, но отличается от любого порядка?

4b9b3361

Ответ 1

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

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.

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

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

Ответ 2

Согласно документации, все операторы сравнения python имеют одинаковый приоритет:

В Python имеется восемь операций сравнения. Все они имеют одинаковый приоритет (что выше, чем у булевых операций).

Однако, сверяя сравнения с скобками, они начинают быть выражениями атомов, поэтому операторы в скобках, оцененные перед внешними выражениями, влияющие на порядок evalutation, я разлагаю первый "противоречивый" случай, все остальные аналогичны:

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