问题
var = 86
print((var < 90) & (var >= 80))
prints True.
But why do all these print False?
print(var < 90 & var >= 80)
print(var < 90 & (var >= 80))
print((var < 90) & var >= 80)
print(var < 90 & True)
回答1:
You should be using the and operator instead for boolean operations.
Since python supports chaining relational operators (i.e. you can use 0 < var < 100 instead of 0 < var and var < 100) and processes binary operations (i.e. addition, subtraction, bitwise operations, etc.) before relational operators due to operator precedence, all of the failing cases you posted actually mean something else.
var < 90 & var >= 80is equivalent to(var < 90 & var) and (90 & var >= 80)var < 90 & (var>=80)is equivalent tovar < 90 & Truefor which look at the 4th case.(var<90) & var>=80is also similar to the 4th case (this resolves toTrue & var >= 80which will then resolve to0 >= 80).var < 90 & Trueis equivalent tovar < (90 & True). The implementation of the&operator is designed to return0if either one of the operands is not an integer (which is another one of the biggest pitfalls of dynamic typing), which is why all such similar statements resolve tovar < 0which is false.
回答2:
It is because of Operator precedence
Take print( var<90 & True) as an example,
print( var<90 & True) is equivalent to print( var < (90 & True)) and hence it gives False.
However if you put in parenthesis in the right place, i.e. print( (var<90) & True), then it will give True.
回答3:
The bitwise operator & has higher precedence than the comparison operators, so the 90 & var is evaluated first, and then a chained comparison takes place.
>>> 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
来源:https://stackoverflow.com/questions/41390988/bitwise-operator-in-chained-comparison