Python3运算符优先级

# python 3.8.11

def foo(val):
    print('foo', val, id(val))
    return val


print('#1', False is not None)  # 首先`is`和`is not`是比地址的,`False`肯定不和`None`一个地址
print('#2', 1 and 2, 2 and 1, True and 0, False and 0)  # 总是第一个为“假”的值其后全部短路,或者最后一个值
print('#3', False or 0, 0 or False, False or 0 or None, False or 1 or None)  # 总是输出第一个为“真”的值,或者最后一个值
print(
    '#4',
    # 如果`or`>`and`输出`False and (True or True)`=`False`,如果`or`<=`and`输出`(False and True) or True`=`True`
    False and True or True,
    # 如果`and`>`or`应该先比较`foo(False)`和`foo(True)`所以foo执行3次,实际只执行2次也就是`and`和`or`同级
    foo(0) or foo(False) and foo(True),
)
# 如果`not`>`and`输出`True and False`=`False`,如果`not`<=`and`输出`not False`=`True`
print('#5', not False and False)
# 若`in`>`not`则输出`not (None in [None,True])`=`not True`=`False`,若`in`<=`not`则输出`(not None) in [None,True]`=`True in [None,True]`=`True`
print('#6', not None in [None, True])
# 若`is`>`or`则输出`False or True`=`True`,若`is`<=`or`则输出`False is False`=`True`
print('#7', False or False is False)
# 若`in`>`not`则输出`not True`=`False`,若`in`<=`not`则输出`True in [False,True]`=`True`
print('#8', not False in [False, True])
print(
    '#9',
    # 若`is not`>`is`则输出`False is False`=`True`,若`is not`<=`is`则输出`False is not False`=`True`
    False is False is not False,
    # 若`is`>`is not`则输出`False is not False`=`False`,若`is`<=`is not`则输出`True is True`=`True`
    foo(False) is not foo(None) is foo(True),
)  # 两个全是`False`,所以`is`和`is not`不是同级的?!
# 若`is not`>`not`则输出`not True`=`False`,若`is not`<=`not`则输出`not False`=`True`
print('#10', not None is not False)
print(
    '#11',
    'a' not in 'c' in 'c',  # `in`和`not in`存在链式运算,这个表达式相当于`'a' not in 'c' and 'c' in 'c'`
)  # 所以不比较了,是同级的
print('#12', False == True in [False, ])  # 也存在链式运算
print('#13', 15 ^ 7 | 9, 9 | 7 ^ 15)  # 异或高于或,因为总是先计算7^15
print('#14', 7 ^ 4 & 5, 5 & 4 ^ 7)  # 与高于异或,因为总是先计算4&5
print('#15', 1 & 3 << 2)  # 位移又高于与,若`<<`<=`&`则`1&3<<2`=`1<<2`=`4`,实际得0
print('#16', 2-1 << 2)  # 若`-`<=`<<`则`2-1<<2`=`2-4`=`-2`
print('#17', 9*10 % 9, 10 % 9*9)  # 按从左到右顺序计算,取余和乘除法同级
print('#18', ~1**2, -1**2)  # `**`优先级很高,总是先计算`**`

#1 True
#2 2 1 0 False
#3 0 False None 1
foo 0 94562501623232
foo False 94562501338976
#4 True False
#5 False
#6 False
#7 True
#8 False
foo False 94562501338976
foo None 94562501451200
foo True 94562501339008
#9 False False
#10 False
#11 True
#12 False
#13 9 9
#14 3 3
#15 0
#16 4
#17 0 9
#18 -2 -1

这样一来优先级从高到低:

**
~ + - (正负号)
* / % //
+ -
<< >>
&
^
|
== > < => <= != in not in
is 
is not
not
or and
    原文作者: 星云 
    原文地址: https://blog.csdn.net/dscn15848078969/article/details/121427427
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞