【问题标题】:Different results between old and new ternary conditional operators in PythonPython中新旧三元条件运算符的结果不同
【发布时间】:2013-05-20 05:09:44
【问题描述】:

只是一个关于三元条件运算符的小问题,困扰了我很久。

代码示例(python 2.7):

>>> x, y = None, 3
>>> x, y
(None, 3)
>>> (x == None and x or y)
3
>>> (x != None and x or y)
3
>>> (x if x == None else y)

第三行和第四行是老式的条件运算符。两者都给出相同的结果。显然, 前者采取“错误”的结果。根据python可能没有错。但这很容易制作 程序中的错误,没有明确的错误。

第五行是根据《Core python Programming》(Wesley J. Chun)一书从2.5版本开始的new-style,它的返回是正确的。

有人知道吗?

【问题讨论】:

  • 有什么问题吗? ...“新”版本更冗长(显式优于隐式)
  • 只有最后一个是三元运算符,这也许就是它起作用的原因吧?
  • @JoranBeasley,最重要的是,正确。与旧版本不同。

标签: python


【解决方案1】:

您的第三行和第四行不是三元运算符。它们是尝试使用其他运算符破解三元运算符,但是,正如您所见,它们并没有真正起作用,因为您使用的逻辑运算符取决于“布尔错误”的概念,而不仅仅是条件,但要根据条件返回的结果。精确添加了真正的三元运算符,因此您不必再使用那种伪造的东西了。

【讨论】:

    【解决方案2】:

    这是这个“条件运算符”hack 的一个已知问题。它不起作用。

    x == None => 是的。正如预期的那样,继续“和”部分。

    and x => 假(因为xNoneNone 是假)。整个and 表达式的计算结果为假,因此or y 发挥作用。结果是y

    【讨论】:

    • 是的,我明白了。感谢您的逻辑分析。
    【解决方案3】:

    没有错。这正是真值和假值起作用的方式。

    (x != None and x or y) 的评估类似于((x != None) and x) or y,如果x 为假,则在两种情况下都将返回yFalse and FalseTrue and False 都是False,所以短路or 将返回y

    and ... or 技巧实际上不是三元运算符,因为没有条件。它只是依赖于or 短路的事实,所以如果x != None and x 是真实的,y 将不会被评估。新式 一个实际的三元运算符。

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 2016-06-26
      • 2022-01-06
      相关资源
      最近更新 更多