Почему «True == False is False» оценивается как «ложь»?

Я получаю довольно неожиданное поведение над выражением, которое работает с == но не с:

 >>> (True == False) is False True >>> True == (False is False) True >>> True == False is False False >>> id(True) 8978640 >>> id(False) 8978192 >>> id(True == False) 8978192 >>> id(False is False) 8978640 

4 Solutions collect form web for “Почему «True == False is False» оценивается как «ложь»?”

Потому что на самом деле это скованное сравнение , поэтому

 True == False is False 

эквивалентно

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

Это может быть удивительно в этом случае, но позволяет писать 1 <= x < 4 отличие от других языков, таких как C.

Из документов :

x <y <= z эквивалентно x <y и y <= z, за исключением того, что y оценивается только один раз (но в обоих случаях z вообще не оценивается, когда x <y оказывается ложным).

В вашем случае True == False is False эквивалентно True == False and False is False поскольку первое условие – False поэтому оно замыкает и возвращает False .

 >>> dis.dis(lambda : True == False is False) 1 0 LOAD_GLOBAL 0 (True) 3 LOAD_GLOBAL 1 (False) 6 DUP_TOP 7 ROT_THREE 8 COMPARE_OP 2 (==) 11 JUMP_IF_FALSE_OR_POP 21 <---------this step 14 LOAD_GLOBAL 1 (False) 17 COMPARE_OP 8 (is) 20 RETURN_VALUE >> 21 ROT_TWO 22 POP_TOP 23 RETURN_VALUE 

Из документации :

5.9. Сравнения

В отличие от C, все операции сравнения в Python имеют тот же приоритет, который ниже, чем у любой арифметической, сдвиговой или побитовой операции. Кроме того, в отличие от C, выражения, подобные a <b <c, имеют общепринятую в математике интерпретацию:

 comparison ::= or_expr ( comp_operator or_expr )* comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" | "is" ["not"] | ["not"] "in" 

True == False is False – это цепное сравнение, что означает то же, что (True == False) and (False is False) . Поскольку первое сравнение ( True==False ) ложно, результатом сопоставления с привязкой является False.

  • Определение, является ли строка палиндром - Python
  • Как запустить скрипт python в определенное время (ы)
  • Использование API LinkedIn с Python
  • Извлеките все ключи из списка словарей
  • ожидаемая строка или буфер в python
  • Как получить правильное имя хоста модуля App Engine с использованием -dot-синтаксиса для SSL с помощью SDK?
  • Список карт Python в список целых чисел
  • ForbiddenError при попытке записать файл в GCS из приложения GAE python
  •  
    Interesting Posts for Van-Lav

    Хранение пользователя и пароля в базе данных

    Как получить Исключительную информацию в Python3

    Внутренние списки Python, доступ и изменение времени автономной работы

    назначить вывод печати переменной в python

    Продукт элементов массива по группам в numpy (Python)

    Неверный список, возвращаемый в python

    Многострочное описание описания параметра в docstring python

    Ошибка импорта Python для модулей, установленных с помощью Homebrew

    Преобразование вложенных списков данных в многомерные массивы Numpy

    Фактически тестирование моего сконструированного приложения (Flask, Python)

    Развертывание CherryPy (демон)

    Как добавить условно к выбору ячеек в столбце dataframe pandas, когда столбец представляет собой серию списков?

    Регулярное выражение Python, соответствующее нескольким строкам

    Сортировка в python – как отсортировать список, содержащий буквенно-цифровые значения?

    заменить значения в массиве

    Python - лучший язык программирования в мире.