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

5

We can use if-else like this:

statement if condition else statement

但是这里还存在一些问题,我不明白为什么会出现这种情况。
  1. If I run count += 1 if True else l = [] (count is defined already), then it raises an error:

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

    Can we not assign a value after else?

  2. When I run count += 1 if False else l.append(count+1) (note: count = 0, l = []), an error will be raised:

     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'
    

    and the result of l is [1].

在相同的条件下,如果我使用 if-else 代码块,则不会出现错误。

你能解释一下其中的差异吗?


7
if ... else ... 不是缩写/单行写法的 if ...: ... else: ...,而是完全不同的东西。 - tobias_k
相关:Python是否有三元条件运算符?(被接受的答案实际上解释了这个错误的原因) - Aran-Fey
1
x if y else z is requires expressions, and you provide it an augmented assignment statement. Your fundamental misunderstanding is that it takes the form statement if condition else statement, rather it should always be <expression> if <expression> else <expression> - juanpa.arrivillaga
3个回答

11
“条件表达式”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。

5
针对您的第一个错误,您试图滥用三元表达式。在Python中,三元表达式不能包含 语句,它们只能包含 表达式
正如可以从 Python官方文法 中看到的那样,赋值是一种语句,方法调用是一种表达式
在您的示例中,l = [] 被认为是一条语句,而 l.append(...) 是一个表达式。
针对您的第二个错误,list.append 返回的是 None,而不是列表。因此,您实际上是试图将 None 添加到整数中,这是不允许的,因此会出现 TypeError
最后,请不要使用小写字母 L (l) 或大写字母 O (O) 作为变量名。正如在 PEP 8 中所述,由于它们与1和0非常相似,这些变量名可能会非常令人困惑。

2
在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 = []

因此出现了语法错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接