Неожиданные результаты логических выражений в 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