Questo ha a che fare con il concatenamento dell'operatore. A differenza di C/C++ e della maggior parte degli altri linguaggi, Python consente di mettere in catena operatori di confronto proprio come faresti nella matematica normale. Dalla documentation:
confronti possono essere concatenati arbitrariamente, ad esempio, x < y <= z
è equivalente a x < y and y <= z
, tranne che y
viene valutata solo una volta (ma in entrambi i casi z
è non valutato affatto quando x < y
si trova ad essere false).
Quindi, questa espressione:
5 > 4 == 1
è effettivamente interpretato come:
5 > 4 and 4 == 1 # Except that 4 is only evaluated once.
che diventa:
True and False
che è False
.
L'utilizzo di parentesi tuttavia modifica il modo in cui Python interpreta il confronto. Questo:
(5 > 4) == 1
diventa:
True == 1
che è True
(vedi sotto per il motivo). Lo stesso vale per:
5 > (4 == 1)
che diventa:
5 > False
che è anche True
.
A causa di PEP 0285, bool
è stata fatta una sottoclasse di int
e True == 1
mentre False == 0
:
>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>
Si potrebbe cercare questo in su, ma uno per essere interrogato un (forse) risultato controintuitivo. – imallett