二元运算符应用于逻辑时的含义是什么?

时间:2012-12-16 17:34:49

标签: python

我的理解是&是按位AND运算符。所以我希望它在应用于逻辑时没有任何意义。但是,我明白了:

>>> False & False
False
>>> False & True
False
>>> True & True
True

等等。对于其他按位运算符也是如此。

那么,为什么这些运算符甚至接受逻辑操作数呢?我在哪里可以找到解释这个的文档?我搜索了它但找不到解释。

3 个答案:

答案 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如何返回boolbool & 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