Почему эти операторы работают так, как ожидалось, когда используются скобки:
>>> (True is False) == False
True
>>> True is (False == False)
True
Но возвращает False
, когда нет скобок?
>>> True is False == False
False
Почему эти операторы работают так, как ожидалось, когда используются скобки:
>>> (True is False) == False
True
>>> True is (False == False)
True
Но возвращает False
, когда нет скобок?
>>> True is False == False
False
На основе python документации о приоритете оператора:
Обратите внимание, что сравнения, тесты членства и тесты идентичности имеют одинаковый приоритет и имеют функцию привязки слева направо цепочка, как описано в разделе "Сравнение".
Итак, у вас есть цепочечный оператор вроде:
>>> (True is False) and (False==False)
False
Можно предположить, что центральный объект будет разделен между двумя операциями и другими объектами (в этом случае False).
Обратите внимание, что это также верно для всех сравнений, включая тесты на членство и операции проверки идентичности, следующие операнды:
in, not in, is, is not, <, <=, >, >=, !=, ==
Пример:
>>> 1 in [1,2] == True
False
Python обладает уникальным транзитивным свойством, когда дело доходит до операторов сравнения. Это проще будет увидеть в более простом случае.
if 1 < x < 2:
# Do something
Это делает то, на что похоже. Он проверяет, является ли 1 < x и если x < 2. То же самое происходит в вашем коде, не заключенном в скобки.
>>> True is False == False
False
Проверяет, является ли True значение False и False == False, только одно из которых истинно.
Это двойное неравенство, которое расширяется как (True is False) and (False == False)
. См. Например Каково приоритет оператора при написании двойного неравенства в Python (явно в коде и как это можно переопределить для массивов?)
Python интерпретирует множественные (в) равенства так, как вы ожидаете в Math:
В Math a = b = c
означают все a = b
, b = c
и a = c
.
Итак, True is False == False
означает True == False
и False == False
и True == False
, что False
.
Для булевых констант is
эквивалентно ==
.
Python выполняет цепочку, если он встречает операторы с одинаковым приоритетом при оценке выражения.
включая тесты, все из которых имеют одинаковый приоритет цепочка слева направо
Указанные ниже операторы имеют одинаковый приоритет.
in, not in, is, is not, <, <=, >, >=, <>, !=, ==
Итак, когда Python пытается оценить выражение True is False == False
, он встречает операторы is
и ==
, которые имеют одинаковый приоритет, поэтому он выполняет цепочку слева направо.
Итак, выражение True is False == False
фактически оценивается как:
(True is False) and (False == False)
дает False
в качестве вывода.