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

时间:2017-02-28 13:17:48

标签: python-3.x

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

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

2 个答案:

答案 0 :(得分:5)

您的第一个结果归因于short-circuit evaluation。以下是Python如何评估表达式:

  1. (1 + 1)缩减为2

  2. 在布尔上下文中将2视为"truthy"

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

  4. 请注意,如果左手操作数是“falsy”,则会立即返回,并且Python不会尝试评估右手操作数。

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

    请注意,在任何情况下,andor都不会独立决定返回TrueFalse,或将任何值转换为True或来自Falsebool。它总是 返回的两个操作数之一(除非你的程序崩溃 - 见下文),无论它们是否为1/0类型。

    你的第二个结果就是零误差除以。像大多数语言一样,Python将除以零视为错误,因为数学中的实数为undefined。一旦Python试图评估True or 1/0 ,你的程序崩溃并且一切都停止了 - Python甚至没有机会看到右手操作数。

    但是,由于上述的短路行为,表达式如下:

    True

    评估为1/0,即使git add .会导致错误,因为在这种情况下,Python根本不会尝试评估右手操作数。

答案 1 :(得分: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。

然后它说,"如果该值是假值,则跳转到6(即返回)"。 2显然不是假的,所以它加载1并且结果是。