2.4.4 Python 中真假的表示与计算*

如前所述,较新版本的 Python 引入了内建类型 bool,并且定义了布尔值 True 和 False。而在此之前,Python 曾经利用 1 和 0 来作为布尔值。

事实上,如今的 Python 在表达真假方面更加灵活——任何内建类型的值都可以解释成布尔值。例如,数值(int、long、float)可以解释成布尔值:0 为 False,非 0 值为 True。又如,字符串也可以解释成布尔值:空串为 False,非空字符串为 True。以后介 绍的列表、元组等数据类型的值也都可以解释为布尔值。

Python 对布尔值的灵活处理方式也影响了逻辑运算符的含义。在 Python 中,布尔表达 式的结果不仅可以是“正宗的”布尔值 True 和 False,还可以是如上所述的各种“非正 宗”布尔值。下面介绍 Python 在实现逻辑运算符采取的策略,我们用 a、b 表示任何表达式(不一定是布尔表达式!)。

(1)a and b:如果 a 的值可解释为 False,则返回 a 的值;否则返回 b 的值。

(2)a or b:如果 a 的值可解释为 False,则返回 b 的值;否则返回 a 的值。

(3)not a:如果 a 的值可解释为 False,则返回 True;否则返回 False。

这些规则看上去有点怪,但仔细思考之后就能理解,它们并没有违反基本的逻辑运算的定义。

以 a and b 为例分析如下:当 a 的值不能解释为 True,我们就不必计算 b 的值,而是直 接返回 a 的值(可解释为 False)作为整个表达式的值;当 a 的值可解释为 True,那么 整个表达式的真假就取决于 b 的值,b 真则表达式真,b 假则表达式假,因此我们可以返回 b 的值作为表达式的值。总之,当且仅当 a 和 b 都可解释为 True 时,表达式 a and b 的 值才可解释为 True。这是完全符合逻辑运算定义的。

对于 or 和 not 也是一样。 下面看几个例子:

>>> 2 and "hello"
'hello'

说明:Python 先计算 2,发现它是非 0 值,可解释为 True,于是按上述规则(1),返回"hello"的值作为结果。

>>> (4 > 5) or 3
3

说明:Python 先计算(4 > 5),发现结果为 False,根据上述规则(2),返回 3 的值作为 表达式的值。

>>> s = "hello"
>>> not s[3:3]
True

说明:Python 先计算 s[3:3]的值,即字符串 s 的切分操作,但这个索引区间是不成立的: 不可能从索引 3 开始,又以 3 作为结束的上限(因为索引区间的上限是不包含在内的)。因 此切分结果是空串。空串被解释为 False,根据上述规则(3),返回 True。

综上所述,Python 对布尔值和布尔运算的处理很灵活,有时能够便利程序设计。但代价是布尔表达式变得难以理解,很容易导致微妙的错误,所以建议读者慎用。