为什么 Python 允许解包一个空的可迭代对象?

Why does Python allow unpacking an empty iterable?

我在写一些代码时犯了一个错字,但没有出错。追溯,我发现这些工作:

>>> [] = []
>>> () = ()
>>> 

这是可迭代的拆包,但没有真正的赋值目标。为什么 Python 允许这样做?这在某些情况下有用吗?

Here's where it's defined in the grammar。我原以为您至少需要一个 identifierattributerefsubscription切片,但显然不是; target_list 括号内可选。

target ::=  identifier
            | "(" [target_list] ")"
            | "[" [target_list] "]"
            | attributeref
            | subscription
            | slicing
            | "*" target

查看文档历史,这在最近 Python 3.4 and 2.6, but assigning to [] was added in Python 3.5 and 2.7, and () in Python 3.6 是不可能的。

相关:

注意:由于我问的是设计选择,所以答案应包括对权威来源的引用,例如官方文档或核心开发人员。

基于 the relevant Python issue discussion,分配给一个空列表 [] 实际上在很长一段时间内都是可行的,但没有记录。在 3.5 中记录之前,这被认为是“相当无害的怪癖”。然后分配给一个空元组 () 是为了保持一致性而添加的。

在同一个线程中,Martin Panter provides a possible use case:

[...] I have used this syntax on purpose as a concise way to ensure that a generator is exhaused with no more yields:

>>> def gen():
...     yield "partial computation"
...     print("computation allowed to complete")
... 
>>> g = gen()
>>> next(g)
'partial computation'
>>> [] = g
computation allowed to complete