【发布时间】:2020-08-22 17:07:16
【问题描述】:
a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))
以下代码的输出是True。但是(c) and (b<0) 不是and 和or 用于c 是整数的布尔类型变量是什么意思?
【问题讨论】:
标签: python boolean boolean-logic boolean-expression
a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))
以下代码的输出是True。但是(c) and (b<0) 不是and 和or 用于c 是整数的布尔类型变量是什么意思?
【问题讨论】:
标签: python boolean boolean-logic boolean-expression
在像 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 和条件表达式都是惰性;除非绝对必要,否则它们不会计算操作数,稍后我们会看到。
如果您更改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 中,可以测试任何对象的真值。对于数字类型,任何非零值都被视为真。可以看到不同类型的真值here。
【讨论】:
当一个变量不是 bool 并且你检查它是 True 或 False 时,python 检查这个变量是否为 None。
例如:
a = 'any_value'
print(a == True)
此语句打印True。
但是:
b = None
print(a == True)
False 中的结果。
【讨论】: