a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))
以下代码的输出为True
。但是(c) and (b<0)
和and
和or
用于c
是整数的布尔型变量的含义是什么?
在像C这样的语言中,没有布尔类型或值;而是使用整数代替它们。零为假,所有其他整数为真。
Python将其概括为all值。的确,有一个布尔类型,但这是int
的子类,并且True
和False
分别是1
和0
的值。通过调用bool
,可以将任何值转换为为布尔值。>>> bool(5)
True
>>> bool(0)
False
>>> bool("foo"), bool([1,2,3])
True, True
>>> bool(""), bool([])
False, False
值的“真实性”取决于其类型,但粗略地说,零和类似容器的空值是False,所有其他值都是True。此外,and
和or
不一定返回布尔值:
x and y == y if bool(x) else x
x or y == x if bool(x) else y
[bool
用于确定x
是否为真,但结果是两个实际值x
或y
之一。
使用等价于and
,我们可以将您的表达式评估为
c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
== b < 0 if bool(2) else c) and a > 0
== (b < 0 if True else c) and a > 0
== b < 0 and a > 0
== a > 0 if bool(b < 0) else b < 0
== a > 0 if bool(-1 < 0) else b < 0
== a > 0 if bool(True) else b < 0
== a > 0 if True else b < 0
== a > 0
== 5 > 0
== True
我没有一次全部替换a
,b
和c
的值,因为and
,or
和条件表达式都是lazy
;除非绝对必要,否则它们不会评估操作数,我们稍后会看到。如果更改c = 0
,则评估过程将产生c
的值,而不是c
的布尔值。请注意,我们需要查看a
的值,因为从未评估过a > 0
。c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
== (b < 0 if bool(0) else c) and a > 0
== (b < 0 if False else c) and a > 0
== c and a > 0
== a > 0 if bool(c) else c
== a > 0 if bool(0) else c
== a > 0 if False else c
== c
== 0
True
还是False
时,python检查此变量是否为None。