【问题标题】:Ternary operator behavior三元运算符行为
【发布时间】:2018-09-18 21:28:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python ternary-operator


    【解决方案1】:

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

    1 if True else 2 + 3 if False else 4
    

    被评估为

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

    返回 1。

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:
        x = 1 if True else 2 + 3 if False else 4
        

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

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

        【讨论】:

          猜你喜欢
          • 2012-08-08
          • 2017-03-05
          • 1970-01-01
          • 2013-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多