【发布时间】:2017-02-28 13:17:48
【问题描述】:
为什么(1+1) and 1 返回1 而不是2?
为什么1/0 or True 评估为error 而不是True?
【问题讨论】:
-
请给出发生这种情况的具体做法
-
让别人帮你做作业可不酷
标签: python-3.x
为什么(1+1) and 1 返回1 而不是2?
为什么1/0 or True 评估为error 而不是True?
【问题讨论】:
标签: python-3.x
您的第一个结果是由于short-circuit evaluation。以下是 Python 评估表达式的方式:
将(1 + 1) 减少到2。
将2 视为布尔上下文中的"truthy"。
计算并返回and的右手操作数。
请注意,如果左手操作数是“假的”,它将立即返回,Python 不会尝试计算右手操作数。
顺便说一句,or 的工作方式类似:如果它是“真实的”,则返回左侧操作数,否则返回右侧操作数。
请注意,在任何情况下,and 或 or 都不会独立决定返回 True 或 False,或将任何值转换为 True 或 False 或从 False 转换任何值。它总是返回的两个操作数之一(除非您的程序崩溃 - 见下文),无论它们是否属于 bool 类型。
您的第二个结果只是除以零错误。与大多数语言一样,Python 将除以零视为错误,因为实数数学中的结果是 undefined。一旦 Python 尝试评估 1/0,您的程序就会崩溃,一切都会停止——Python 甚至没有机会查看右手操作数。
但是,由于上述短路行为,以下表达式:
True or 1/0
即使1/0 会导致错误,也会计算为True,因为在这种情况下,Python 根本不会尝试计算右手操作数。
【讨论】:
1/0 不评估为假。它不会评估任何东西,因为它实际上毫无意义,因此引发ZeroDivisionError 并在在任何其他事情发生之前停止执行。当试图评估某事导致致命错误时,所有赌注都被取消。
1/0 不会“返回”错误。它是一个错误,会导致你的程序崩溃。
1/0 是一颗小行星。
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,这就是结果。
【讨论】: