为什么(1+1) and 1
会返回 1
而不是 2
?
为什么1/0 or True
评估为错误而不是 True
?
答案 0 :(得分:5)
您的第一个结果归因于short-circuit evaluation。以下是Python如何评估表达式:
将(1 + 1)
缩减为2
。
在布尔上下文中将2
视为"truthy"。
评估并返回and
的右手操作数。
请注意,如果左手操作数是“falsy”,则会立即返回,并且Python不会尝试评估右手操作数。
顺便说一句,or
以类似的方式工作:如果它是“truthy”,则返回左手操作数,如果不是,则返回右手操作数。
请注意,在任何情况下,and
或or
都不会独立决定返回True
或False
,或将任何值转换为True
或来自False
或bool
。它总是 返回的两个操作数之一(除非你的程序崩溃 - 见下文),无论它们是否为1/0
类型。
你的第二个结果就是零误差除以。像大多数语言一样,Python将除以零视为错误,因为数学中的实数为undefined。一旦Python试图评估True or 1/0
,你的程序崩溃并且一切都停止了 - Python甚至没有机会看到右手操作数。
但是,由于上述的短路行为,表达式如下:
True
评估为1/0
,即使git add .
会导致错误,因为在这种情况下,Python根本不会尝试评估右手操作数。
答案 1 :(得分:4)
In [1]: import dis
In [2]: dis.dis('(1+1) and 1')
1 0 LOAD_CONST 1 (2)
2 JUMP_IF_FALSE_OR_POP 6
4 LOAD_CONST 0 (1)
>> 6 RETURN_VALUE
首先,Python将1+1
预编译为2。
然后它说,"如果该值是假值,则跳转到6(即返回)"。 2
显然不是假的,所以它加载1并且结果是。