Ответ 1
Это связано с цепочкой операторов. В отличие от C/С++ и большинства других языков, Python позволяет вам связывать операторы сравнения так же, как и в обычной математике. Из документа :
Сравнение может быть закодировано произвольно, например,
x < y <= z
эквивалентноx < y and y <= z
, за исключением того, чтоy
оценивается только один раз (но в обоих случаяхz
вообще не оценивается, когдаx < y
оказывается ложь).
Итак, это выражение:
5 > 4 == 1
фактически интерпретируется как:
5 > 4 and 4 == 1 # Except that 4 is only evaluated once.
который становится:
True and False
который равен False
.
Использование скобок, однако, изменяет то, как Python интерпретирует ваше сравнение. Это:
(5 > 4) == 1
становится:
True == 1
который равен True
(см. ниже, почему). То же самое для:
5 > (4 == 1)
который становится:
5 > False
который также является True
.
Из-за PEP 0285, bool
был сделан подкласс int
и True == 1
, а False == 0
:
>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>