为什么这个条件不会引发异常:(1 == 0 <= 1/0)== False?Python如何解析这个?

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.

jpp*_*jpp 7

1 == 0 <= 1/0

1/0永远不会被评估.该表达式触发Python中的链式比较.评估为:

(1 == 0) and (0 <= 1/0)
Run Code Online (Sandbox Code Playgroud)

达到and某个False值时发生逻辑短路,因此从未测试过第二个条件.从1 == 0评估到False,结果是False.


1 == 1 <= 1/0

同样,这被评估为:

(1 == 1) and (1 <= 1/0)
Run Code Online (Sandbox Code Playgroud)

由于第一个表达式是True,所以评估第二个表达式.这导致了ZeroDivisionError.


(1 == 0)<= 1/0

括号比比较运算符具有更高的优先级.所以这里没有触发链式比较.表达式评估为False <= 1/0.当然,比较将失败ZeroDivisionError.


1 == 1 <= 1/1,1 = = 0 <= 1/1

在这里,您定义了一个tuple结果.分隔两个表达式的逗号的存在隐含了一个元组.第一个,从那时开始1==1 <= 1/1评估.第二,评估从那以后.TrueTrue <= 11==0 <= 1/1TrueFalse <= 1

这些比较的工作原因bool是它的子类int,所以True相当于1False等价0.