三元运算符行为
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.
我最近开始使用三元运算符,但我遇到了一个情况,我需要在同一行中使用多个三元运算符,但它们似乎并没有像我预期的那样工作。
谁能解释一下为什么这些行给出不同的结果。
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.