Python is, == operator precedence

后端 未结 2 2012

In Python3,

a = b = 3
a is None == b is None

returns False, but

(a is None) == (b is None)

returns True.

相关标签:
2条回答
  • 2021-01-07 23:01

    According to the documentation, all python comparisons operators has same priority:

    There are eight comparison operations in Python. They all have the same priority (which is higher than that of the Boolean operations).

    However by wrapping comparisons with the brackets, they start to be the atoms expressions, so statements in brackets evaluated before statements outside, that impacts the order of the evalutation, I will decompose the first "contradictional" case, the all others is similar:

    a = b = 3
    a is None == b is None
    

    Per documentation the priority is the same, so evaluation is next:

    1. a is None ? -> False # Because a == 3
    2. False == b -> False # Because b == 3
    3. False is None
    

    Please see order for the second case below:

    (a is None) == (b is None)
    
    1. a is None ? -> False # Because a == 3
    2. b is None -> False # Because b == 3
    3. False is False -> True
    
    0 讨论(0)
  • What you see here is operator chaining and there is no precedence involved at all!

    Python supports expressions like

    1 < a < 3
    

    To test that a number is in between 1 and 3; it's equal to (1 < a) and (a < 3) except that a is only evaluated once.

    Unfortunately that also means that e.g.

    None is None == None
    

    actually means

    (None is None) and (None == None)
    

    which is of course True, and the longer example you started with

    a = b = 3
    a is None == b is None
    

    means

    (a is None) and (None == b) and (b is None)
    

    which can only be True if both a and b are None.

    Documentation here, see the bit about chaining.

    Very useful sometimes but it also pops up when you least expect it!

    0 讨论(0)
提交回复
热议问题