当还考虑了扩展包装的初始PEP时,将解释这两种情况之间的区别:
PEP 3132 -- Extended iterableunpacking。
在该PEP的摘要中,我们可以看到:
该PEP提议对可迭代的解包语法进行更改,从而允许指定“全包”名称,该名称 将被分配 所有未分配给“常规”名称的项目 的列表
。
(强调我的)
因此,在第一种情况下 ,执行后:
*elements, = iterable
elements总是将
list包含内所有项目的
iterable。
即使在两种情况下看起来都相似,
*在这种情况下(左侧)也意味着:捕获未分配给名称的所有内容并将其分配给加星号的表达式。它的工作原理类似的方式作为
*args和
**kwargs在做的
函数定义 。
def spam(*args, **kwargs): """ args and kwargs group positional and keywords respectively """
第二种情况(右侧)有些不同 。在这里,我们没有
*像通常在 函数调用中
那样以“全部捕获”方式进行工作。它扩展了附加的可迭代对象的内容。因此,该语句:
elements = *iterable,
可以视为:
elements = 1, 2, 3, 4,
这是a
tuple初始化的另一种方式。
请注意,
list可以通过简单使用创建一个
elements =[*iterable],它将解压缩
iterablein的内容
[]并导致对form的赋值
elements = [1, 2, 3, 4]。



