为什么*x,unpack在python 3中映射对象?

San*_*wal 4 python python-3.x iterable-unpacking

在Python 3中,以下内容返回一个map对象:

map(lambda x: x**2, range(10))
Run Code Online (Sandbox Code Playgroud)

如果我们想将此对象转换为列表,我们可以使用将其转换为列表list(mapobject).但是,我通过代码高尔夫发现了这一点

*x, = mapobject
Run Code Online (Sandbox Code Playgroud)

使x成为一个列表.为什么在Python 3中允许这样做?

Zer*_*eus 7

这是PEP 3132引入Python 3的扩展可迭代解包的示例:

此PEP建议更改可迭代解包语法,允许指定"catch-all"名称,该名称将分配未分配给"常规"名称的所有项目的列表.

一个例子说超过一千个字:

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

像往常一样在Python中,使用尾随逗号表示单例元组,因此扩展等效于:

>>> x, = [1]
>>> x
1
Run Code Online (Sandbox Code Playgroud)

… 这是:

>>> *x, = range(3)
>>> x
[0, 1, 2]
Run Code Online (Sandbox Code Playgroud)