对非布尔变量的布尔运算

问题描述 投票:0回答:3
a = 5
b = -1
c = 2

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

以下代码的输出为True。但是(c) and (b<0)andor用于c是整数的布尔型变量的含义是什么?

python boolean boolean-logic boolean-expression
3个回答
2
投票

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

Python将其概括为all值。的确,有一个布尔类型,但这是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


1
投票
在python中,可以测试任何对象的真值。对于数字类型,任何非零值都将被视为true。您可以看到不同类型here的真值。

1
投票
[当变量不是布尔值并且您检查它是True还是False时,python检查此变量是否为None。
© www.soinside.com 2019 - 2024. All rights reserved.