a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))
以下代码的输出为True
。但是(c) and (b<0)
的意思是and
和or
不用于c
是整数的布尔型变量吗?
在像C这样的语言中,没有布尔类型或值;相反,使用整数来代替它们。零为假,所有其他整数为真。
Python将其推广到所有值。的确,有一个布尔类型,但它是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
在python中,可以测试任何对象的真值。在数字类型的情况下,任何非零值都被视为true。你可以在这里看到不同类型的真值。
当一个变量不是布尔并且您检查它是True
还是False
时,python会检查这个变量是否为None。
例如:
a = 'any_value'
print(a == True)
此语句打印True
。
但是:
b = None
print(a == True)
结果为CCD_ 32。