当前位置: 首页 > 面试题库 >

为什么splatting在rhs上创建一个元组,而在lhs上创建一个列表?

陆正奇
2023-03-14
问题内容

考虑例如

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上进行排序时,会得到一个列表,而当我们在rhss上进行布局时,会得到一个元组。

为什么?

这是设计使然吗,如果是,原因是什么?否则,是否有任何技术原因?还是只是这样,没有特殊原因?


问题答案:

您在RHS上获得元组的事实与splat无关。splat只会解压缩您的map迭代器。你解压 由你使用的元组语法的事实决定:

*whatever,

而不是列表语法:

[*whatever]

或设置语法:

{*whatever}

您可能已经获得一个列表或一组。您刚刚告诉Python创建一个元组。

在LHS上,分散的分配目标始终会产生一个列表。是否使用“元组样式”都没关系

*target, = whatever

或“列表样式”

[*target] = whatever

目标列表的语法。该语法看起来很像用于创建列表或元组的语法,但是目标列表语法是完全不同的事情。

PEP 3132中引入了您在左侧使用的语法,以支持诸如以下的用例

first, *rest = iterable

在拆包任务中,将iterable的元素按位置分配给未加星标的目标,如果有加星标的目标,则将所有多余内容填充到列表中并分配给该目标。选择一个列表而不是一个元组可以使进一步处理变得容易。由于您的示例中
只有加 星标的目标,因此所有项目都位于分配给该目标的“附加”列表中。



 类似资料: