三元运算给出 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
可能是True
或False
,整个 元组 (1/0, 2)
在尝试 select 一个之前创建(即 两个 元素),因此无论 x
为何都会发生错误。 =29=]
三元运算符允许在单行中测试条件,替换多行 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 thanx
. IfC
is true,x
is evaluated and its value is returned; otherwise,y
is evaluated and its value is returned.
换句话说,只有一个的潜在表达式被评估。
在(1/0, 2)[x]
中x
可能是True
或False
,整个 元组 (1/0, 2)
在尝试 select 一个之前创建(即 两个 元素),因此无论 x
为何都会发生错误。 =29=]