今天敲代码发现个奇怪的问题:
a = 1
b = 2
print(a == 1 & b == 2) # False
print((a == 1) & (b == 2)) # True
print(a == 1 and b == 2) # True
print((a == 1) and (b == 2)) # True
查了下发现:
& : 按位与运算符,把数字当作二进制来看,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
and: 布尔"与" - 如果 x 或y为 False,x and y 返回 False
运算符优先级(自上而下,优先级提高):
运算符 | 描述 |
---|---|
lambda | Lambda表达式 |
or | 布尔“或” |
and | 布尔“与” |
not x | 布尔“非” |
in,not in | 成员测试 |
is,is not | 同一性测试 |
<,<=,>,>=,!=,== | 比较 |
| | 按位或 |
^ | 按位异或 |
& | 按位与 |
<<,>> | 移位 |
+,- | 加法与减法 |
*,/,% | 乘法、除法与取余 |
+x,-x | 正负号 |
~x | 按位翻转 |
** | 指数 |
x.attribute | 属性参考 |
x[index] | 下标 |
x[index:index] | 寻址段 |
f(arguments...) | 函数调用 |
(experession,...) | 绑定或元组显示 |
[expression,...] | 列表显示 |
{key:datum,...} | 字典显示 |
'expression,...' | 字符串转换 |
可见&优先级比判断优先级==高,式子(a == 1 & b == 2)中,先计算1 & b 为False,再计算a == False 为False,再计算False == 2为False。