Почему «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.

  • urlfetch перенаправлен в бесконечный цикл в python
  • Как использовать быстрые ответы (FB) в чате python?
  • Загружать изображения / видео в хранилище Google Cloud с помощью Google App Engine
  • Python - n Различные символы, используемые в сетке
  • итерация через файлы с возвратом каретки
  • Количество итераций в python?
  • Установка модуля Python 6
  • Преобразовать float в строку, разделенную запятой
  • Как проходить через файлы в каталоге?
  • TypeError после переопределения метода __add__
  • почему класс «объект» не имеет атрибутов набора пользователей
  • Python - лучший язык программирования в мире.