我的理解是&
是按位AND运算符。所以我希望它在应用于逻辑时没有任何意义。但是,我明白了:
>>> False & False
False
>>> False & True
False
>>> True & True
True
等等。对于其他按位运算符也是如此。
那么,为什么这些运算符甚至接受逻辑操作数呢?我在哪里可以找到解释这个的文档?我搜索了它但找不到解释。
答案 0 :(得分:8)
那么,为什么这些运算符甚至接受逻辑操作数?
bool
子类int
,并覆盖__and__()
等,以便为bool
个操作数返回bool
。
有关详细信息,请参阅PEP 285。
具体做法是:
6) Should bool inherit from int? => Yes In an ideal world, bool might be better implemented as a separate integer type that knows how to perform mixed-mode arithmetic. However, inheriting bool from int eases the implementation enormously (in part since all C code that calls PyInt_Check() will continue to work -- this returns true for subclasses of int). Also, I believe this is right in terms of substitutability: code that requires an int can be fed a bool and it will behave the same as 0 or 1. Code that requires a bool may not work when it is given an int; for example, 3 & 4 is 0, but both 3 and 4 are true when considered as truth values.
和
class bool(int):
def __and__(self, other):
if isinstance(other, bool):
return bool(int(self) & int(other))
else:
return int.__and__(self, other)
__rand__ = __and__
def __or__(self, other):
if isinstance(other, bool):
return bool(int(self) | int(other))
else:
return int.__or__(self, other)
__ror__ = __or__
def __xor__(self, other):
if isinstance(other, bool):
return bool(int(self) ^ int(other))
else:
return int.__xor__(self, other)
__rxor__ = __xor__
请注意bool & bool
如何返回bool
而bool & non-bool
继承int
的行为(即返回int
)。
以下是一些展示这些属性的示例:
In [12]: isinstance(True, int)
Out[12]: True
In [13]: True & True
Out[13]: True
In [14]: True & 1
Out[14]: 1
以上行为不适用于算术运算符。那些只是使用int
的行为:
In [15]: True + 0
Out[15]: 1
In [16]: True + False
Out[16]: 1
答案 1 :(得分:0)
“Logicals”,也就是布尔值,只是代表一个开启或关闭的位,所以当然按位运算对它们起作用。什么会让你期望按位运算不能用于单个位?
您正在反转逻辑运算的继承。按位运算的基本情况是单个位变量,例如布尔值。对较大值的按位运算只是单比特运算的扩展应用。
答案 2 :(得分:0)
在Python 3.x中,True和False是关键字,并且始终等于1和0.
在Python 2中的正常情况下,始终在Python 3中:
虚假对象的类型为bool,它是int的子类:
object
|
int
|
bool