Почему эти операторы работают так, как ожидалось, когда используются скобки:
>>> (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 в качестве вывода.