三元 if-else 语句中的语法错误

Syntax error in ternary if-else statement

我们可以这样使用 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 块,则没有错误。

你能解释一下区别吗?

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

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

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

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

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

与"conditional expression"A if C else B is not a one-line version of the if/else statement if C: A; else: B可是完全不同的东西。第一个将评估 表达式 AB 然后 return 结果,而后者将只执行 语句 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 returns None 不能添加到 count,因此出现 TypeError.

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

则另一个值

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

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

但是这条线真正做的是这样的:

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

因此出现语法错误。