三元运算符行为

Yas*_*ris 4 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
Run Code Online (Sandbox Code Playgroud)

如果我添加括号,我会得到预期的结果,但我不明白括号的变化.

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

3 if False else 4 + 1 if True else 2  # x = 5
Run Code Online (Sandbox Code Playgroud)

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

3 if False else 4 + 1 if False else 2  # x = 5 # x = 2 ???
Run Code Online (Sandbox Code Playgroud)

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

duc*_*inh 6

原因是运算符优先级.条件表达式具有最低但只有一个优先级,只有lambda表达式较低.因此,表达

1 if True else 2 + 3 if False else 4
Run Code Online (Sandbox Code Playgroud)

被评估为

1 if True else ((2 + 3) if False else 4)
Run Code Online (Sandbox Code Playgroud)

返回1.


Dan*_*Dan 5

可以把它想象为在三个输入中的每个输入周围应用括号:

x = (1) if (True) else ((2 + 3) if (False) else (4))
Run Code Online (Sandbox Code Playgroud)

在这里你可以清楚地看到x它将是相等的1,你2 + 3...将不会被运行.

当你"旋转"它时:

(3) if (False) else ((4 + 1) if (True) else (2))
Run Code Online (Sandbox Code Playgroud)

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

在你的最后一个案例中

(3) if (False) else ((4 + 1) if (False) else (2))
Run Code Online (Sandbox Code Playgroud)

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

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

x = (1) if (True) else ((2 + 3) if (False) else (4))
Run Code Online (Sandbox Code Playgroud)

if True:
    x = 1
else:
    if False:
        x = 2 + 3
    else:
        x = 4
Run Code Online (Sandbox Code Playgroud)