Почему `True - False == False`, False в Python?

Почему эти операторы работают так, как ожидалось, когда используются скобки:

>>> (True is False) == False
True

>>> True is (False == False)
True

Но возвращает False, когда нет скобок?

>>> True is False == False
False

Ответ 1

На основе python документации о приоритете оператора:

Обратите внимание, что сравнения, тесты членства и тесты идентичности имеют одинаковый приоритет и имеют функцию привязки слева направо цепочка, как описано в разделе "Сравнение".

Итак, у вас есть цепочечный оператор вроде:

>>> (True is False) and (False==False)
False

Можно предположить, что центральный объект будет разделен между двумя операциями и другими объектами (в этом случае False).

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

in, not in, is, is not, <, <=, >, >=, !=, ==

Пример:

>>> 1 in [1,2] == True
False

Ответ 2

Python обладает уникальным транзитивным свойством, когда дело доходит до операторов сравнения. Это проще будет увидеть в более простом случае.

if 1 < x < 2:
    # Do something

Это делает то, на что похоже. Он проверяет, является ли 1 < x и если x < 2. То же самое происходит в вашем коде, не заключенном в скобки.

>>> True is False == False
False

Проверяет, является ли True значение False и False == False, только одно из которых истинно.

Ответ 4

Python интерпретирует множественные (в) равенства так, как вы ожидаете в Math:

В Math a = b = c означают все a = b, b = c и a = c.

Итак, True is False == False означает True == False и False == False и True == False, что False.

Для булевых констант is эквивалентно ==.

Ответ 5

Python выполняет цепочку, если он встречает операторы с одинаковым приоритетом при оценке выражения.

включая тесты, все из которых имеют одинаковый приоритет цепочка слева направо

Указанные ниже операторы имеют одинаковый приоритет.

in, not in, is, is not, <, <=, >, >=, <>, !=, ==

Итак, когда Python пытается оценить выражение True is False == False, он встречает операторы is и ==, которые имеют одинаковый приоритет, поэтому он выполняет цепочку слева направо.

Итак, выражение True is False == False фактически оценивается как:

(True is False) and (False == False)

дает False в качестве вывода.