python3中的扩展序列解包

时间:2015-11-27 11:50:14

标签: 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 []

现在我改变了将变量分配为:

的顺序
>>> a, b, *e, c, d = seq
>>> print(a, b, c, d, e)

我输出为:

>>> 1, 2, 3, 4, []

所以我的问题是为什么上面的 * e 变量始终被分配一个空列表,无论它出现在哪里?

3 个答案:

答案 0 :(得分:5)

在第一种情况下

a, b, c, d, *e = seq

由于序列只有四个元素,abcd获取所有元素,其余元素将存储在{{1 }}。由于序列中没有任何内容,e是一个空列表。

在第二种情况下,

e

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

答案 1 :(得分:5)

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

  

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

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

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

答案 2 :(得分:2)

def skip_last(seq):
    it = iter(seq)
    p = next(it)
    for n in it:
        yield p
        p = n

>>> print (''.join(skip_last('ABCDE')))
'ABCD'

a, b, *e, c, d = [1, 2, 3, 4] 说“遗留在*e中的内容”。因为你有4个元素,所以空序列被放入e