非布尔变量的布尔运算

Boolean Operations on Non Boolean variables

a = 5
b = -1
c = 2

print((c) and (b<0) and (a>0))

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

在python中,可以测试任何对象的真值。在数字类型的情况下,任何非零值都被认为是真实的。可以看到不同类型的真值here.

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

Python 将其概括为 所有 值。没错,有一个布尔类型,但它是 int 的子类,TrueFalse 字面上的 10。任何值都可以通过调用 bool 转换 为布尔值。

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

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

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

bool用于判断x是否为真,但结果是xy.[=37这两个实际值之一=]

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

当一个变量不是 bool 并且你检查它是 True 还是 False 时,python 检查这个变量是否是 None。

例如:

    a = 'any_value'
    print(a == True)

这条语句打印 True.

但是:

    b = None
    print(a == True)

结果 False