关于三元条件算子的一个小问题让我困惑了很长时间。
代码示例(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版的新版本,它的回归是正确的。
有人对此有所了解吗?
答案 0 :(得分:5)
您的第三和第四行不是三元运算符。他们试图使用其他运算符来破解三元运算符,但正如您所看到的,它们并不真正起作用,因为您使用的逻辑运算符取决于“布尔虚假”的概念,而不仅仅是条件,但是您希望根据条件返回的结果。真正的三元运算符被精确添加,因此您不必再使用那种伪造了。
答案 1 :(得分:2)
这是一个已知的问题,这个"条件运算符"黑客攻击。它不起作用。
x == None
=>真正。继续前往"和"部分,正如所料。
and x
=> false(因为x
是None
,而None
是假的)。整个and
表达式的计算结果为false,因此or y
开始起作用。结果是y
。
答案 2 :(得分:1)
没错。这只是真实和虚假价值观的运作方式。
(x != None and x or y)
的评估方式与((x != None) and x) or y
类似,如果y
为假,则x
会返回False and False
。 True and False
和False
都是or
,因此短路y
将返回and ... or
。
or
技巧实际上不是三元运算符,因为没有条件。它仅仅依赖于x != None and x
短路的事实,因此如果y
是真实的,则{{1}}将不会被评估。新式 是一个实际的三元运算符。