例如,考虑一下

squares = *map((2).__rpow__, range(5)),
squares
# (0, 1, 4, 9, 16)

*squares, = map((2).__rpow__, range(5))
squares
# [0, 1, 4, 9, 16]

所以,在其他条件相同的情况下,我们在lhs上绘制时得到一个列表,在rhs上绘制时得到一个元组.

为什么?

这是故意的吗?如果是,理由是什么?或者,如果没有,是否有任何技术原因?还是只是这样,没有特别的原因?

推荐答案

在RHS上得到一个元组的事实与splat无关.splat只是解压了你的map迭代器.解包的内容取决于您使用的元组语法:

*whatever,

而不是列表语法:

[*whatever]

或设置语法:

{*whatever}

你本可以得到一份 list 或一套.你刚刚告诉Python制作一个元组.


在LHS上,飞溅的分配目标总是生成一个列表.不管你是否使用"元组风格"

*target, = whatever

或者"列表风格"

[*target] = whatever

目标列表的语法.语法看起来很像创建列表或元组的语法,但目标列表语法是完全不同的.

您在左边使用的语法是在PEP 3132年引入的,用于支持以下用例:

first, *rest = iterable

在解包任务中,iterable的元素按位置分配给未排序的目标,如果有带星号的目标,则任何额外的元素都会填充到列表中并分配给该目标.A list was chosen instead of a tuple to make further processing easier.因为你的例子中有一个带星号的目标,所以所有项目都在分配给该目标的"额外项目"列表中.

Python-3.x相关问答推荐

Pandas 数据帧断言等同于NaN

如何从拼图分区数据集中读取数据到Polar

如何将多个字典合并到一个列中,并为不同的行使用相同的键

检测点坐标 - opencv findContours()

查找值始终为零的行 pandas

错误:无法为 pyconcorde 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

命名空间前缀无效

tkinter/python3.9 中的 Entry 子类和用户输入重复的问题

Python中提取每个组/ID所属特定列中的自然数

如何将列表和字典逐行组合在一起

如何知道Pandas 列中的每个后续值是否都大于前面的值? Python相关

为什么 Multiprocessing 的 Lock 不会阻止其他进程使用对象?

具有 2 个输入的 python 3 map/lambda 方法

Django 2 个字段之一不能为空

Pytorch 的随机 Select ?

django - 值更改后自动更新日期

如何配置 Atom 以运行 Python3 脚本?

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

为什么 2to3 将 mydict.keys() 更改为 list(mydict.keys())?

在python中,如果一个函数没有return语句,它会返回什么?