非布尔变量的布尔运算
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)
的意思是不是 and
和 or
用于 c
是整数的布尔类型变量?
在python中,可以测试任何对象的真值。在数字类型的情况下,任何非零值都被认为是真实的。可以看到不同类型的真值here.
在像 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
一个值的 "truthiness" 取决于它的类型,但粗略地说,零和类似空容器的值是 False,所有其他值都是 True。此外,and
和 or
不一定 return 布尔值:
x and y == y if bool(x) else x
x or y == x if bool(x) else y
bool
用于判断x
是否为真,但结果是x
或y
.[=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
我没有一次替换 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
当一个变量不是 bool 并且你检查它是 True
还是 False
时,python 检查这个变量是否是 None。
例如:
a = 'any_value'
print(a == True)
这条语句打印 True
.
但是:
b = None
print(a == True)
结果 False
。
a = 5
b = -1
c = 2
print((c) and (b<0) and (a>0))
以下代码的输出是True
。但是 (c) and (b<0)
的意思是不是 and
和 or
用于 c
是整数的布尔类型变量?
在python中,可以测试任何对象的真值。在数字类型的情况下,任何非零值都被认为是真实的。可以看到不同类型的真值here.
在像 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
一个值的 "truthiness" 取决于它的类型,但粗略地说,零和类似空容器的值是 False,所有其他值都是 True。此外,and
和 or
不一定 return 布尔值:
x and y == y if bool(x) else x
x or y == x if bool(x) else y
bool
用于判断x
是否为真,但结果是x
或y
.[=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
我没有一次替换 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
当一个变量不是 bool 并且你检查它是 True
还是 False
时,python 检查这个变量是否是 None。
例如:
a = 'any_value'
print(a == True)
这条语句打印 True
.
但是:
b = None
print(a == True)
结果 False
。