2017-02-28 135 views
-5

为什么(1+1) and 1返回1而不是2为什么(1 + 1)和1返回1而不是2?

为什么1/0 or True评估为错误,而不是True

+0

请给出一个具体的做法,发生这种情况 – We0

+0

http:// cs61a。org/lab/lab01/ –

+0

要求人们为你做功课不是很酷 –

回答

5

您的第一个结果归因于short-circuit evaluation。下面是Python的计算表达式:

  1. 减少(1 + 1)2

  2. 在布尔上下文中考虑2"truthy"

  3. 评估并返回and的右侧操作数。

请注意,如果左操作数是“虚假”,它将立即返回,并且Python不会试图评估右手操作数。

顺便说一句,or以类似的方式工作:它返回左手操作数,如果它是“truthy”,如果不是,则返回右操作数。

注意,在任何情况下做andor以往自主决定返回TrueFalse或任意数值转换为或TrueFalse。它总是返回的两个操作数中的一个(除非程序崩溃 - 请参见下文),无论它们是否为bool

你的第二个结果只是一个除零误差。像大多数语言一样,Python将零除作为错误,因为实数的数学结果为undefined。只要Python试图评估1/0,程序就会崩溃,一切都会停止 - Python从来没有机会看到右手操作数。

然而,上述因短路行为,下面的表达式:

True or 1/0 

评估为True即使1/0会导致错误,因为Python从不试图同时评估右手操作所有在这种情况下。

+0

但1/0或True返回错误根据上面的注释python应该给返回true,因为在1或者语句中,如果1/0计算结果为false,那么它应该返回true,但是返回错误 –

+2

'1/0 ** **不计算为false。它不计算任何东西,因为它在字面上毫无意义,因此会引发'ZeroDivisionError'并在执行任何其他事情之前停止执行*。当试图评估某些事情会导致致命错误时,所有投注都将关闭。 –

+0

认识到'1/0'不会“返回”错误是很重要的。它**是**错误,并导致程序崩溃。 –

4

Hard to argue与解释器/字节码:

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

然后,它说,“如果该值是一个falsey值,则跳转到图6(即,返回) ”。 2显然不是错误的,所以它加载1,这就是结果。