非布尔变量上的布尔运算


a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))

以下代码的输出为True。但是(c) and (b<0)的意思是andor不用于c是整数的布尔型变量吗?

在像C这样的语言中,没有布尔类型或值;相反,使用整数来代替它们。零为假,所有其他整数为真。

Python将其推广到所有值。的确,有一个布尔类型,但它是int的子类,TrueFalse分别是10。通过调用bool,任何值都可以转换为布尔值

>>> bool(5)
True
>>> bool(0)
False
>>> bool("foo"), bool([1,2,3])
True, True
>>> bool(""), bool([])
False, False

一个值的"真实性"取决于它的类型,但粗略地说,零和类似空容器的值是False,所有其他值都是True。此外,andor不一定返回布尔值:

x and y == y if bool(x) else x
x or y == x if bool(x) else y

bool用于确定x是否为真,但结果是两个实际值xy之一。

使用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

我没有同时替换abc的值,因为andor和条件表达式都是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。

最新更新