This has to do with operator chaining. Unlike C/C++ and most other languages, Python allows you to chain comparison operators just like you would in normal mathematics. From the documentation:
Comparisons can be chained arbitrarily, e.g., x < y <= z is
equivalent to x < y and y <= z, except that y is evaluated only once
(but in both cases z is not evaluated at all when x < y is found to be
false).
So, this expression:
5 > 4 == 1
is actually interpreted as:
5 > 4 and 4 == 1 # Except that 4 is only evaluated once.
which becomes:
True and False
which is False.
Using parenthesis however changes how Python interprets your comparison. This:
(5 > 4) == 1
becomes:
True == 1
which is True (see below for why). Same goes for:
5 > (4 == 1)
which becomes:
5 > False
which is also True.
Because of PEP 0285, bool was made a subclass of int and True == 1 while False == 0:
>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>