按位'&'链式比较中的运算符

时间:2016-12-30 05:17:55

标签: python comparison bitwise-operators

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)

3 个答案:

答案 0 :(得分:4)

您应该使用and运算符代替布尔运算。

因为python支持链接关系运算符(即你可以使用0 < var < 100而不是0 < var and var < 100)并处理二进制运算(即加法,减法,按位运算等)之前 >由于运算符优先级而导致的关系运算符,您发布的所有失败案例实际上都意味着其他内容。

  1. var < 90 & var >= 80相当于(var < 90 & var) and (90 & var >= 80)
  2. var < 90 & (var>=80)相当于var < 90 & True,查看第4个案例。
  3. (var<90) & var>=80也与第四种情况相似(此解析为True & var >= 80,然后将解析为0 >= 80)。
  4. var < 90 & True相当于var < (90 & True)&运算符的实现旨在返回0,如果其中一个操作数不是整数(这是动态类型的另一个最大缺陷),这就是为什么所有这些类似的语句解析为var < 0,这是假的。

答案 1 :(得分:1)

这是因为Operator precedence

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