Search code examples
pythonboolean-logicoperator-precedence

Why is the boolean expression "1 in (1, 2, 3) == True" False?


Why does the statement 1 in (1, 2, 3) == True return False in Python? Is the operator priority in Python ambiguous?


Solution

  • Because, per the documentation on operator precedence:

    Note that comparisons, membership tests, and identity tests, all have the same precedence and have a left-to-right chaining feature as described in the Comparisons section.

    The Comparisons section shows an example of the chaining:

    Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z

    So:

    1 in (1, 2, 3) == True
    

    is interpreted as:

    (1 in (1, 2, 3)) and ((1, 2, 3) == True)
    

    If you override this chaining by adding parentheses, you get the expected behaviour:

    >>> (1 in (1, 2, 3)) == True
    True
    

    Note that, rather than comparing truthiness by equality to True or False, you should just use e.g. if thing: and if not thing:.