链式比较中的按位“&”运算符
Bitwise '&' operator in chained comparison
var = 86
print((var < 90) & (var >= 80))
打印 True
.
但是为什么所有这些都打印 False
?
print(var < 90 & var >= 80)
print(var < 90 & (var >= 80))
print((var < 90) & var >= 80)
print(var < 90 & True)
以print( var<90 & True)
为例,
print( var<90 & True)
等同于 print( var < (90 & True))
因此它给出 False。
但是如果你在正确的地方加上括号,即 print( (var<90) & True)
,那么它会给出 True。
按位运算符 &
的优先级高于比较运算符,因此首先计算 90 & var
,然后进行链式比较。
>>> var = 86
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80
False
>>> var<(90 & var)>=80 # same as above
False
>>> (var<90) & (var>=80)
True
您应该使用 and
运算符来代替布尔运算。
由于 python 支持链接关系运算符(即您可以使用 0 < var < 100
而不是 0 < var and var < 100
)并处理二元运算(即加法、减法、按位运算等)before 关系运算符由于运算符的优先级,您发布的所有失败案例实际上意味着其他东西。
var < 90 & var >= 80
等价于 (var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
等同于 var < 90 & True
看第 4 种情况。
(var<90) & var>=80
也类似于第 4 种情况(这解析为 True & var >= 80
,然后解析为 0 >= 80
)。
var < 90 & True
等同于 var < (90 & True)
。 &
运算符的实现被设计为 return 0
如果其中一个操作数不是整数(这是动态类型的另一个最大陷阱),这就是为什么所有类似的陈述都解析为 var < 0
,这是错误的。
var = 86
print((var < 90) & (var >= 80))
打印 True
.
但是为什么所有这些都打印 False
?
print(var < 90 & var >= 80)
print(var < 90 & (var >= 80))
print((var < 90) & var >= 80)
print(var < 90 & True)
以print( var<90 & True)
为例,
print( var<90 & True)
等同于 print( var < (90 & True))
因此它给出 False。
但是如果你在正确的地方加上括号,即 print( (var<90) & True)
,那么它会给出 True。
按位运算符 &
的优先级高于比较运算符,因此首先计算 90 & var
,然后进行链式比较。
>>> var = 86
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80
False
>>> var<(90 & var)>=80 # same as above
False
>>> (var<90) & (var>=80)
True
您应该使用 and
运算符来代替布尔运算。
由于 python 支持链接关系运算符(即您可以使用 0 < var < 100
而不是 0 < var and var < 100
)并处理二元运算(即加法、减法、按位运算等)before 关系运算符由于运算符的优先级,您发布的所有失败案例实际上意味着其他东西。
var < 90 & var >= 80
等价于(var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
等同于var < 90 & True
看第 4 种情况。(var<90) & var>=80
也类似于第 4 种情况(这解析为True & var >= 80
,然后解析为0 >= 80
)。var < 90 & True
等同于var < (90 & True)
。&
运算符的实现被设计为 return0
如果其中一个操作数不是整数(这是动态类型的另一个最大陷阱),这就是为什么所有类似的陈述都解析为var < 0
,这是错误的。