if else语句中的语法错误

时间:2018-07-14 19:01:14

标签: python

我们可以像这样使用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
    

不能再给它赋值吗?

  1. 当运行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块,也没有错误。你能解释一下区别吗?

3 个答案:

答案 0 :(得分:10)

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

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

同样,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中,因此是TypeError。

答案 1 :(得分:4)

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

in Python's official grammar可见,赋值是声明,方法调用是表达式

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

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

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

答案 2 :(得分: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 = []

出现语法错误。