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

2024-09-27 00:15:49 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么要计算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提出零除法例外:

print((1==0) <= 1/0)

输出:ZeroDivisionError: division by zero

另外,为什么下面会引发一个例外?你知道吗

1==1 <= 1/0

输出:ZeroDivisionError: division by zero

注意:这也适用于其他例外情况,可能适用于任何情况,因为python不计算不等式的右侧。你知道吗

为什么?你知道吗

我可以理解,如果懒散的评价是True,但为什么False?感觉像是Python里的虫子。你知道吗


Tags: infalsetrueforby情况逻辑括号
1条回答
网友
1楼 · 发布于 2024-09-27 00:15:49

1==0<;=1/0

1/0从不计算。表达式在Python中触发链式比较。评估如下:

(1 == 0) and (0 <= 1/0)

当达到False值时,逻辑and短路,因此第二个条件永远不会被测试。因为1 == 0的计算结果是False,所以结果是False。你知道吗


1==1<;=1/0

同样地,这被评估为:

(1 == 1) and (1 <= 1/0)

因为第一个表达式是True,所以对第二个表达式求值。这导致ZeroDivisionError。你知道吗


(1==0)<;=1/0

括号的优先级高于比较运算符。所以这里不会触发链式比较。表达式的计算结果为False <= 1/0。当然,比较将失败,因为ZeroDivisionError。你知道吗


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

在这里,您定义了tuple个结果。元组是由分隔两个表达式的逗号所隐含的。第一个1==1 <= 1/1,计算结果是True,因为True <= 1。第二个1==0 <= 1/1,计算结果是True,因为False <= 1。你知道吗

因为boolint的一个子类,所以True等价于1False等价于0,所以这些比较是有效的。你知道吗

相关问题 更多 >

    热门问题