我最近开始使用三元运算符,但我遇到了一个案例,我需要在同一行中使用多个三元运算符,但它们似乎没有像我预期的那样工作。
有人可以解释为什么这些行给出不同的结果。
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 ???
是因为你不应该在同一行中有多个三元运算符,还是他们的另一个原因?
答案 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)
(除非你想玩不同的结构只是为了好玩,我真的不建议你这样编写代码。)