三元运算给出 1/0 的错误输出

Ternary operation giving the wrong output for 1/0

三元运算符允许在单行中测试条件,替换多行 if-else 使代码紧凑。

[on_true] if [expression] else [on_false] 

我们也可以通过使用像(b, a) [a < b]这样的元组来使用直接方法。 让我们看一个例子

ck = True
print(2 if ck else 1)
print((1, 2)[ck])

这里两个输出都是2。现在,如果我更改输出 2 & 1/0 元组总是会引发零除法错误。

print(2 if ck else 1/0)
print((1/0, 2)[ck])

(2, 1/0)[ck] 出现同样的错误。三元 if-else 在任何情况下都显示正确的结果,但为什么元组会引发错误 1/0?

因为ck=True第一种情况还没有求值,所以没有必要去求else。而在元组的情况下,它正在创建元组然后评估。

编辑:查看此 explanation。它被称为“惰性评估”。

实际上,根据规范,它非常正确结果:-)

在表达式 2 if True else 1/0 中(我在这里使用 True 因为这就是你的 ck 变量在所有情况下设置的内容),1/0 实际上从来没有evaluated. 尽管它在 2 if False else 1/0 中,所以在这种情况下你会得到被零除错误。 online docs 说明这一点(我的重点):

The expression x if C else y first evaluates the condition, C rather than x. If C is true, x is evaluated and its value is returned; otherwise, y is evaluated and its value is returned.

换句话说,只有一个的潜在表达式被评估。

(1/0, 2)[x]x可能是TrueFalse整个 元组 (1/0, 2) 在尝试 select 一个之前创建(即 两个 元素),因此无论 x 为何都会发生错误。 =29=]