三元运算符行为

Ternary operator behavior

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

谁能解释一下为什么这些行给出不同的结果。

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 ???

是因为你不应该在同一行中使用多个三元运算符,还是其他原因?

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

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

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

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

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

在这里你可以清楚地看到 x 等于 1 而你的 2 + 3... 不会是 运行.

当你'rotated'它时:

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

所以现在 3 不是 运行 因为条件是 False 所以你得到 4 +... 术语

在你的最后一个案例中

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

它 returns 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

原因是operator precedence。条件表达式具有 lowest-but-one 优先级,只有 lambda 表达式较低。因此,表达式

1 if True else 2 + 3 if False else 4

被评估为

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

其中 returns 1.