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
评估.第二,评估从那以后.True
True <= 1
1==0 <= 1/1
True
False <= 1
这些比较的工作原因bool
是它的子类int
,所以True
相当于1
和False
等价0
.
归档时间: |
|
查看次数: |
68 次 |
最近记录: |