zeh*_*zeh 4 python boolean-logic boolean-operations python-3.x
为什么评估这个False?
1==0 <= 1/0
首先请注意,在Python中:
bols = [False, True]
for A in bols:
for B in bols:
print(f'{str(A):>5}, {str(B):>5}, {str(A<=B):>5}')
输出:
False, False, True
False, True, True
True, False, False
True, True, True
如果你熟悉布尔逻辑,这对你来说应该很自然.
现在它变得奇怪了:
print(1==1 <= 1/1, 1==0 <= 1/1)
日期: True, False
现在它变得更奇怪了:
print(1==0 <= 1/0)
日期: False
为什么最后一个不会抛出一个例外?
我的第一个猜测是因为解析问题.例如,先前的比较我们可以修复添加括号:
print(1==1 <= 1/1, (1==0) <= 1/1)
日期: True, True
但是,如果这个问题是一个解析问题,那么当我们除以0时,为什么python不会引发异常呢?
如果我们在最后一次比较中添加括号,我们可以强制Python提高ZeroDivision Exeption:
print((1==0) <= 1/0)
日期: ZeroDivisionError: division by zero
另外,为什么以下引发异常?
1==1 <= 1/0
日期: ZeroDivisionError: division by zero
注意:这也可以与其他例外一起使用,因为python不会评估不等式的右侧.
为什么?
我会理解,如果laizy评估True,但为什么False?感觉就像Python中的一个bug.
1/0永远不会被评估.该表达式触发Python中的链式比较.评估为:
(1 == 0) and (0 <= 1/0)
Run Code Online (Sandbox Code Playgroud)
达到and某个False值时发生逻辑短路,因此从未测试过第二个条件.从1 == 0评估到False,结果是False.
同样,这被评估为:
(1 == 1) and (1 <= 1/0)
Run Code Online (Sandbox Code Playgroud)
由于第一个表达式是True,所以评估第二个表达式.这导致了ZeroDivisionError.
括号比比较运算符具有更高的优先级.所以这里没有触发链式比较.表达式评估为False <= 1/0.当然,比较将失败ZeroDivisionError.
在这里,您定义了一个tuple结果.分隔两个表达式的逗号的存在隐含了一个元组.第一个,从那时开始1==1 <= 1/1评估.第二,评估从那以后.TrueTrue <= 11==0 <= 1/1TrueFalse <= 1
这些比较的工作原因bool是它的子类int,所以True相当于1和False等价0.