问题
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 >= 80
is equivalent to(var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
is equivalent tovar < 90 & True
for which look at the 4th case.(var<90) & var>=80
is also similar to the 4th case (this resolves toTrue & var >= 80
which will then resolve to0 >= 80
).var < 90 & True
is equivalent tovar < (90 & True)
. The implementation of the&
operator is designed to return0
if 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 < 0
which 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