【问题标题】:Syntax error in ternary if-else statement三元 if-else 语句中的语法错误
【发布时间】:2018-12-22 20:42:21
【问题描述】:

我们可以像这样使用 if-else:

statement if condition else statement

但是这里有一些问题,我不明白为什么。

  1. 如果我运行count += 1 if True else l = [](计数已定义),则会引发错误:

     File "<ipython-input-5-d65dfb3e9f1c>", line 1
     count += 1 if True else l = []
                               ^
     SyntaxError: invalid syntax
    

    else 之后不能赋值吗?

  2. 当我运行count += 1 if False else l.append(count+1)(注意:count = 0, l = [])时,会报错:

     TypeError    Traceback (most recent call last)
     <ipython-input-38-84cb28b02a03> in <module>()
     ----> 1 count += 1 if False else l.append(count+1)
    
     TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
    

    l 的结果是[1]

使用相同的条件,如果我使用 if-else 块,则没有错误。

你能解释一下区别吗?

【问题讨论】:

  • ... if ... else ... 不是简写/单行if ...: ... else: ...,而是完全不同的东西。
  • 相关:Does Python have a ternary conditional operator?(接受的答案实际上解释了这个错误的原因)
  • x if y else z 需要 表达式,并且您为其提供一个扩充的赋值 statement。您的基本误解是它采用statement if condition else statement 的形式,而应该始终是&lt;expression&gt; if &lt;expression&gt; else &lt;expression&gt;

标签: python conditional-operator


【解决方案1】:

“条件表达式”A if C else B 不是 if/else 语句if C: A; else: B 的单行版本,而是完全不同的东西。第一个将评估 表达式 AB 然后返回结果,而后者将只执行 语句 AB .

更清楚地说,count += 1 if True else l = [] 不是 (count += 1) if True else (l = []),而是count += (1 if True else l = []),但l = [] 不是表达式,因此语法错误。

同样,count += 1 if False else l.append(count+1) 不是(count += 1) if False else (l.append(count+1)) 而是count += (1 if False else l.append(count+1))。从语法上讲,这没问题,但是append 返回None,不能添加到count,因此出现TypeError。

【讨论】:

    【解决方案2】:

    对于您的第一个错误,您试图滥用三元表达式。在 Python 中,三元表达式不能包含 语句,它们包含 表达式

    可以看出in Python's official grammar,赋值是语句,方法调用是表达式

    在您的示例中,l = [] 被视为语句,而 l.append(...) 是表达式。

    对于第二个错误,list.append 返回 None,而不是列表。因此,您实际上是在尝试将 None 添加到一个整数中,这是不允许的,因此是 TypeError

    最后,请不要使用小写 L's (l) 或大写 o's (O) 作为变量名。正如PEP 8 中所述,由于它们与 1 和 0 相似,这些变量名称可能会非常令人困惑。

    【讨论】:

      【解决方案3】:

      python 中的单行if-else 语句更像其他语言中的三元运算符。它不仅仅是if-else 块的更紧凑版本。单行if-else 计算为一个值,而if-else 块指定应采取不同操作的条件。单行的if-else 语句就像一个函数,在某个条件下返回一个值,如果条件为False,则返回另一个值。

      所以在你的例子中,当你写count += 1 if True else l = []时,我认为你的意思是:

      if True:
          count += 1
      else:
          l = []
      

      但这条线的真正作用是这样的:

      if True:
          count += 1
      else:
          count += l = []
      

      因此语法错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多