python3中的扩展序列解包

Cod*_*sci 4 python python-3.x

我创建一个列表:

>>> seq = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

现在我分配变量如下:

>>> a, b, c, d, *e = seq
>>> print(a, b, c, d, e)
Run Code Online (Sandbox Code Playgroud)

我输出为:

>>> 1 2 3 4 []
Run Code Online (Sandbox Code Playgroud)

现在我改变我将变量赋值为的顺序:

>>> a, b, *e, c, d = seq
>>> print(a, b, c, d, e)
Run Code Online (Sandbox Code Playgroud)

我输出为:

>>> 1, 2, 3, 4, []
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么*上面的变量总是被分配一个空列表而不管它出现在哪里?

the*_*eye 5

在第一种情况下

a, b, c, d, *e = seq
Run Code Online (Sandbox Code Playgroud)

因为序列只有四个元素a,b,c并d得到所有他们和他们的其余部分将被存储在e.由于序列中没有任何内容,因此e是一个空列表.

在第二种情况下,

a, b, *e, c, d = seq
Run Code Online (Sandbox Code Playgroud)

前两个元素将被分配到a和b分别.但是之后我们有两个元素*e.因此,最后两个元素将分配给它们.现在,没有什么了seq.这就是为什么它再次得到一个空列表.


kwi*_*nks 5

根据PEP 3132(我的大胆),这是一个设计选择:

简单赋值左侧的元组(或列表)(未为扩充赋值定义解包)最多可包含一个前缀为单个星号的表达式(此后称为"已加星标"的表达式,而其他表达式则为该列表被称为"强制").这指定了一个子表达式,该子表达式将被分配一个列表,其中包含未被分配给任何强制表达式的可迭代迭代的所有项目,或者如果没有这样的项目,则为空列表.

实际上,PEP中的第一个例子说明了你的观点:

>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)