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