Неожиданные результаты логических выражений в Python

Возможный дубликат:
Почему выражение 0 < 0 == 0 возвращает False в Python?

Следующий вывод из Python 2 REPL смущает меня:

>>> 15>10==True
False
>>> 15>1==True
True
>>> 15>2==True
False
>>> 15>False
True

Если 15>10==True оценивается как (15>10)==True выражение упростит до print True==Trueчто, очевидно, оценивает True, Если 15>10==True оценивается как 15>(10==True) выражение упрощается до 15>False который также оценивает True, Обе эти интерпретации противоречат действительному значению выражения (False).

я могу понять 15>1==True оценивая True поскольку 1==True верно, но нет толкования 15>10==True имеет смысл для меня.

Резюме: в Python 2 почему 15>10==True оценить False?

2 ответа

Решение

Это потому что цепное сравнение в Python. А именно, 15>10==True фактически оценивается как:

15 > 10 and 10 == True

который False,

С другой стороны, 15>1==True такой же как

15 > 1 and 1 == True

который оценивает True,


Цитировать из документов:

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

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

Сравнения дают логические значения: True или False.

Сравнения могут быть связаны произвольно, например, x

Формально, если a, b, c,..., y, z являются выражениями и op1, op2, ..., opN являются операторами сравнения, то a op1 b op2 c ... y opN z эквивалентен op1 b и b op2 c и... y opN z, за исключением того, что каждое выражение оценивается не более одного раза.

Обратите внимание, что op1 b op2 c не подразумевает какого-либо сравнения между a и c, так что, например, x z совершенно законно (хотя, возможно, не красиво).

Я полагаю, что вы неосознанно сталкиваетесь с "аккуратной" функцией операторов python:

В отличие от C выражения типа a

In [12]: 15>10==True
Out[12]: False

В данном выражении значение true рассматривается как 1, т.е.

In [13]: 15>10==1
Out[13]: False

Но затем, заменив == на оператор>, мы увидим, что новое выражение истинно согласно приведенному выше правилу:

In [14]: 15>10>1
Out[14]: True
Другие вопросы по тегам