我们可以像这样使用if-else:statement if condition else statement
,但是这里有些问题我不明白为什么?
如果我运行count += 1 if True else l = []
(已经定义了计数),则会引发错误:
File "<ipython-input-5-d65dfb3e9f1c>", line 1
count += 1 if True else l = []
^
SyntaxError: invalid syntax
不能再给它赋值吗?
当运行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块,也没有错误。你能解释一下区别吗?
答案 0 :(得分:10)
“条件表达式” A if C else B
不是if / else语句if C: A; else: B
的单行版本,而是完全不同的东西。前者将评估表达式 A
或B
,然后返回结果,而后者将仅执行语句 {{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 = []
出现语法错误。