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]