为什么`True 和~True` -2?

Hoj*_*Cho 1 python python-3.7

如果这是低于标准的问题,我非常抱歉,但我找不到明确的答案。

正如标题所说,为什么True and (~True)给出 -2 而True&(~True)给出 0?另外,为什么他们两个都不给False

这是非常违反直觉的,因为我期望有一个布尔表达式&并且and应该以相同的方式工作。

gil*_*lch 8

True在 Python 中的值为 1。位反转 (~) 二进制 1 (...0001) 为您提供 ...1110。由于负整数由表示二进制补,这是的值-2。

and如果为假,Logical返回其左操作数,否则返回右操作数。(True显然,永远不会是假的。)

&另一方面,按位适用于单个位。...0001 & ...1110 在相同位置没有 1 位,因此它们在结果中都是零。


我只是惊讶于 dtype=bool 的 numpy 数组与文字 bool 的行为不同

每个 Python 类型都可以使用特殊的方法名称实现运算符的方法。(像.__invert__()~)。但是andornot没有这些挂钩,所以往往&|~来代替。对于ints 实现是按位的,但其他类型可以根据需要解释运算符。

请注意,它boolintPython 中的子类,因此它具有与int. 但是您操作的是 a numpy.ndarray,而不是其各个组件,因此 Python 使用ndarray运算符的实现,这与boolwhen 不同dtype=bool