python3中的扩展序列解包

python3中的扩展序列解包,python,python-3.x,Python,Python 3.x,我创建一个列表,如下所示: >>> seq = [1, 2, 3, 4] 现在我分配变量如下: >>> a, b, c, d, *e = seq >>> print(a, b, c, d, e) 我得到的输出是: >>> 1 2 3 4 [] >>> 1, 2, 3, 4, [] 现在,我将变量赋值的顺序更改为: >>> a, b, *e, c, d = seq >>&

我创建一个列表,如下所示:

>>> seq = [1, 2, 3, 4]
现在我分配变量如下:

>>> a, b, c, d, *e = seq
>>> print(a, b, c, d, e)
我得到的输出是:

>>> 1 2 3 4 []
>>> 1, 2, 3, 4, []
现在,我将变量赋值的顺序更改为:

>>> a, b, *e, c, d = seq
>>> print(a, b, c, d, e)
我得到的输出是:

>>> 1 2 3 4 []
>>> 1, 2, 3, 4, []
所以我的问题是,为什么上面的*e变量总是被分配一个空列表,而不管它出现在哪里?

在第一种情况下

a, b, c, d, *e = seq
由于序列只有四个元素,
a
b
c
d
获取所有元素,其余元素将存储在
e
中。由于序列中没有剩余内容,
e
是一个空列表

a, b, *e, c, d = [1, 2, 3, 4]
在第二种情况下

a, b, *e, c, d = seq
前两个元素将分别分配给
a
b
。但是在
*e
后面有两个元素。因此,最后两个元素将被分配给它们。现在,
序列中没有任何内容了。这就是为什么它再次得到一个空列表

a, b, *e, c, d = [1, 2, 3, 4]

*e
说“剩下的东西放进
e
”。因为您有4个元素,所以空序列被放入
e

这是一个设计选择,根据(以粗体显示):

简单赋值左侧的元组(或列表)(未为扩充赋值定义解包)最多可包含一个以单个星号开头的表达式(此后称为“带星号”的表达式,而列表中的其他表达式称为“必填”)。这将指定一个子表达式,该子表达式将被分配一个列表,其中包含要解包的iterable中未分配给任何强制表达式的所有项,或者如果没有此类项,则指定一个空列表

事实上,政治公众人物计划中的第一个例子说明了你的观点:

>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]