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

Interesting Posts

Эффективный способ добавления массива numpy

Что делает оператор ** maths в Python?

pyHook перестает получать события нажатия клавиши (случайным образом)?

Константы класса в python

Предоставление пользователям возможности загрузки сценариев Python для выполнения

Как получить доступ к атрибутам текущего исполняемого модуля из других модулей?

Приложите нос @attr к названию теста

Сохранить аудиофайлы KIVY, PYTHON

Преобразование двоичного строкового представления байта в фактическое двоичное значение в Python

одновременная запись в тот же файл с использованием потоков и процессов

Python – расшифровка GPG, но GNUPG не

Экспорт диаграмм из Excel в виде изображений с использованием Python

Самый быстрый способ доказать связанный список – круговой? в python

Python. Почему методы поиска и индекса работают по-разному?

python-запросы, эквивалентные бинарнику -data-curl?

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