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)
答案 0 :(得分:4)
您应该使用and
运算符代替布尔运算。
因为python支持链接关系运算符(即你可以使用0 < var < 100
而不是0 < var and var < 100
)并处理二进制运算(即加法,减法,按位运算等)之前 >由于运算符优先级而导致的关系运算符,您发布的所有失败案例实际上都意味着其他内容。
var < 90 & var >= 80
相当于(var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
相当于var < 90 & True
,查看第4个案例。(var<90) & var>=80
也与第四种情况相似(此解析为True & var >= 80
,然后将解析为0 >= 80
)。var < 90 & True
相当于var < (90 & True)
。 &
运算符的实现旨在返回0
,如果其中一个操作数不是整数(这是动态类型的另一个最大缺陷),这就是为什么所有这些类似的语句解析为var < 0
,这是假的。答案 1 :(得分:1)
以print( var<90 & True)
为例,
print( var<90 & True)
相当于print( var < (90 & True))
,因此它给出了假。
但是如果你把括号放在正确的位置,即print( (var<90) & True)
,那么它将给出真。
答案 2 :(得分:0)
按位运算符&
的优先级高于比较运算符,因此首先计算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