1

只是一个关于三元条件运算符的小问题,让我困惑了很长时间。

例如代码(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版开始的new-style,它的返回是正确的。

有人知道吗?

4

3 回答 3

5

您的第三行和第四行不是三元运算符。它们是尝试使用其他运算符破解三元运算符,但是,正如您所见,它们并没有真正起作用,因为您使用的逻辑运算符取决于“布尔错误”的概念,而不仅仅是条件,但要根据条件返回的结果。精确添加了真正的三元运算符,因此您不必再使用那种伪造品了。

于 2013-05-20T05:14:05.903 回答
2

这是这个“条件运算符”黑客的一个已知问题。这没用。

x == None=> 真的。正如预期的那样,继续“和”部分。

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

于 2013-05-20T05:13:37.293 回答
1

这没有错。这正是真值和假值起作用的方式。

(x != None and x or y)被评估为,如果是假的,这两种情况都((x != None) and x) or y将返回。并且两者都是,所以短路会返回。yxFalse and FalseTrue and FalseFalseory

and ... or诀窍实际上不是三元运算符,因为没有条件。or它只是依赖于短路的事实,所以如果x != None and x是真的,y将不会被评估。新式一个实际的三元运算符。

于 2013-05-20T05:14:51.657 回答