三元运算符行为

时间:2018-04-09 13:03:31

标签: python ternary-operator

我最近开始使用三元运算符,但我遇到了一个案例,我需要在同一行中使用多个三元运算符,但它们似乎没有像我预期的那样工作。

有人可以解释为什么这些行给出不同的结果。

x = 1 if True else 2 + 3 if False else 4  # x = 1, I expected 5
x = (1 if True else 2) + (3 if False else 4)  # x = 5

如果我添加括号,我会得到预期的结果,但我不明白括号会改变什么。

如果我旋转添加,没有括号,我会得到正确的值。

3 if False else 4 + 1 if True else 2  # x = 5

但是,如果第二个三元运算符为False,则会得到错误的结果:

3 if False else 4 + 1 if False else 2  # x = 5 # x = 2 ???

是因为你不应该在同一行中有多个三元运算符,还是他们的另一个原因?

3 个答案:

答案 0 :(得分:6)

原因是operator precedence。条件表达式具有最低但只有一个优先级,只有lambda表达式较低。因此,表达式

1 if True else 2 + 3 if False else 4

评估为

1 if True else ((2 + 3) if False else 4)

返回1.

答案 1 :(得分:5)

将其视为在三个输入中的每个输入周围应用括号:

x = (1) if (True) else ((2 + 3) if (False) else (4))

在这里,您可以清楚地看到x将等于1,并且您的2 + 3...将无法运行。

当你“旋转”它时:

(3) if (False) else ((4 + 1) if (True) else (2))

现在,3未运行,因为条件为False,因此您获得4 +...字词

在你的最后一个案例中

(3) if (False) else ((4 + 1) if (False) else (2))

它返回2,因为(4+1)是第二个条件的真实条件(False

如果您仍然感到困惑,请将其写为常规if声明:

x = (1) if (True) else ((2 + 3) if (False) else (4))

变为

if True:
    x = 1
else:
    if False:
        x = 2 + 3
    else:
        x = 4

答案 2 :(得分:4)

x = 1 if True else 2 + 3 if False else 4

相同
x = (1) if (True) else (2 + 3 if False else 4)

(除非你想玩不同的结构只是为了好玩,我真的不建议你这样编写代码。)