为什么这个操作数返回 False?

Why are this operands returning False?

我在 Python 中编写脚本时遇到了一个违反直觉的问题。

>>> def foo():
...     return False
... 
>>> foo()
False
>>> foo()==False
True
>>> i=1
>>> i!=0
True
>>> foo()==False & i!=0
False
>>> (foo()==False) & i!=0
True
>>> 

如你所见 foo()==False returns True as i! =0 确实如此,所以凭直觉我会期望 True & True 到 return True,但是当我 运行 foo()==False & i!=0 我收到 False 当我 运行 (foo()==False) & i !=0 我得到了最初预期的 True。这里发生了什么?

& 的优先级高于 ==!= 在 python 中,因此使用 (foo()==False) & (i!=0) 以确保不会发生操作数优先级冲突。

原因是python有运算符优先级,参考doc:

Comparisons(==,!=) 的优先级低于 Bitwise AND(&):

foo()==False & i!=0 ==> foo()==(False & i)!=0

(foo()==False) & i!=0 ==> ((foo()==False) & i)!=0

这是简单的 python 操作顺序。在

foo()==False & i!=0

按位和&==有更高的优先级。因此,你真的在​​评估

foo()==(False & i)!=0

如果您将按位和 & 替换为逻辑和 and,您的答案将按预期出现

>>> foo()==False and i!=0
True

了解更多信息 here

&是按位运算符,你可以用它来判断一个数是偶数还是奇数。由于 foo() returns False 被认为是 0 而 0 不被认为是奇数,位运算符 & 将 return False 因为是不是奇数。

根据 python 文档 6.16。运算符优先级 & 的优先级高于 == 或 != 因此当你 运行 foo()==False & i!=0 被评估如下

foo()==False & i!=0
foo() == (False & True)!= 0  #since 1 is nothing but True
Foo() == False != False

这是错误的。

https://docs.python.org/3/reference/expressions.html#summary

我最初尝试包含 table 但不知道如何在 Whosebug 中执行此操作。对不起。