Python中新旧三元条件运算符之间的结果不同

时间:2013-05-20 05:09:45

标签: python

关于三元条件算子的一个小问题让我困惑了很长时间。

代码示例(python 2.7):

>>> x, y = None, 3
>>> x, y
(None, 3)
>>> (x == None and x or y)
3
>>> (x != None and x or y)
3
>>> (x if x == None else y)

第三行和第四行是旧式条件运算符。两者都给出了相同的结果。显然, 前者采取“错误”的结果。根据python,也许没有错。但它很容易制作 程序中的错误,没有明确的错误。

根据“Core python programming”一书(Wesley J. Chun),第五行是2.5版的新版本,它的回归是正确的。

有人对此有所了解吗?

3 个答案:

答案 0 :(得分:5)

您的第三和第四行不是三元运算符。他们试图使用其他运算符来破解三元运算符,但正如您所看到的,它们并不真正起作用,因为您使用的逻辑运算符取决于“布尔虚假”的概念,而不仅仅是条件,但是您希望根据条件返回的结果。真正的三元运算符被精确添加,因此您不必再使用那种伪造了。

答案 1 :(得分:2)

这是一个已知的问题,这个"条件运算符"黑客攻击。它不起作用。

x == None =>真正。继续前往"和"部分,正如所料。

and x => false(因为xNone,而None是假的)。整个and表达式的计算结果为false,因此or y开始起作用。结果是y

答案 2 :(得分:1)

没错。这只是真实和虚假价值观的运作方式。

(x != None and x or y)的评估方式与((x != None) and x) or y类似,如果y为假,则x会返回False and FalseTrue and FalseFalse都是or,因此短路y将返回and ... or

or技巧实际上不是三元运算符,因为没有条件。它仅仅依赖于x != None and x短路的事实,因此如果y是真实的,则{{1}}将不会被评估。新式 是一个实际的三元运算符。