为什么带星号的赋值会生成列表而不是元组?

Edi*_*oba 10 python tuples list iterable-unpacking

在Python中,我可以写这样的东西:

some_list = [(1, 2, 3), (3, 2, 1)]

for i, *args in some_list:
   print(args)
Run Code Online (Sandbox Code Playgroud)

我将得到下一个输出:

[2, 3]
[2, 1]
Run Code Online (Sandbox Code Playgroud)

当我们用作*args函数参数时,它会被解压缩到tuple.

为什么我们会list在这种情况下收到 a ?

sch*_*ggl 10

这只是一个设计决定。PEP 3132tuple中对使其成为 a进行了辩论,但因可用性原因被拒绝:

使加星标的目标成为元组而不是列表。这将与函数的 *args 一致,但会使结果的进一步处理变得更加困难。

同样,将其设置为与赋值的右侧可迭代对象相同的类型,也会被拒绝:

尝试为加星号的目标指定与源可迭代相同的类型,例如,b in a, *b = 'hello' 将被分配字符串 'ello'。这看起来不错,但不可能对所有可迭代对象都保持一致。

您的示例列在同一 PEP 的规范下。

在该辩论的邮件列表中可以找到一些推理。

在处理迭代器时,您事先不知道长度,因此获取元组的唯一方法是首先生成一个列表,然后从中创建一个元组。