【问题标题】:Why do (1+1) and 1 returns 1 instead of 2?为什么 (1+1) 和 1 返回 1 而不是 2?
【发布时间】:2017-02-28 13:17:48
【问题描述】:

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

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

【问题讨论】:

标签: python-3.x


【解决方案1】:

您的第一个结果是由于short-circuit evaluation。以下是 Python 评估表达式的方式:

  1. (1 + 1) 减少到2

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

  3. 计算并返回and的右手操作数。

请注意,如果左手操作数是“假的”,它将立即返回,Python 不会尝试计算右手操作数。

顺便说一句,or 的工作方式类似:如果它是“真实的”,则返回左侧操作数,否则返回右侧操作数。

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

您的第二个结果只是除以零错误。与大多数语言一样,Python 将除以零视为错误,因为实数数学中的结果是 undefined。一旦 Python 尝试评估 1/0,您的程序就会崩溃,一切都会停止——Python 甚至没有机会查看右手操作数。

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

True or 1/0

即使1/0 会导致错误,也会计算为True,因为在这种情况下,Python 根本不会尝试计算右手操作数。

【讨论】:

  • 但是根据上面的注释,1/0 或 True 返回错误,python 应该返回 true,因为在 or 语句中,如果 1/0 评估为 false,那么它应该返回 true,但它返回错误跨度>
  • 1/0 评估为假。它不会评估任何东西,因为它实际上毫无意义,因此引发ZeroDivisionError 并在在任何其他事情发生之前停止执行。当试图评估某事导致致命错误时,所有赌注都被取消。
  • 重要的是要意识到1/0 不会“返回”错误。它一个错误,会导致你的程序崩溃。
  • 这样想——如果你在出租车里,你正在接近一个路口,司机通常必须选择走哪条路。但是,如果一颗小行星从天而降,并在司机决定的时候撞到了出租车,出租车就会被炸成碎片,而你也不会沿着任何一条路走下去。 1/0 是一颗小行星。
【解决方案2】:

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,这就是结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2013-01-09
    • 2015-08-24
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多