考虑以下示例:
>>> t = (1, 2, 3)
>>> a, b, c = t
>>> a, b, c
(1, 2, 3)
>>> a, *b = t
>>> a, b
(1, [2, 3])
为什么用a, *b = t
打开元组时为什么会得到列表而不是元组?
答案 0 :(得分:8)
如PEP 3132中所述,这是扩展的可迭代拆包。类型不会“改变”;只是定义了*
的解压缩将在所有情况下产生一个列表。
有人建议它产生:
将加星标的目标设为元组而不是列表。这与函数的
*args
是一致的,但是使结果的进一步处理变得更加困难。
尝试为加星标的目标提供与源可迭代源相同的类型,例如,将为
b
中的a, *b = 'hello'
分配字符串'ello'
。这看起来不错,但不可能与所有可迭代对象保持一致。
最终,这些提议被拒绝了。
答案 1 :(得分:1)
您可以在此链接https://www.python.org/dev/peps/pep-3132/中找到更多信息,但我认为这主要是因为这是通用的可迭代拆包,因此它将内容首先转换为列表以处理通用情况:
此外,如果右边的值不是列表,而是可迭代的,则它具有 在进行切片之前将其转换为列表
我认为元组是一种特殊情况,实现可以允许它作为元组返回,因为元组已经允许切片,但看起来在这种情况下决定实现最通用的版本。
答案 2 :(得分:1)
在Python 3.0中,*
运算符已添加到多重赋值语法中,从而使我们能够在解压缩到列表中之后捕获剩余的项。 *
运算符使我们可以替换序列末尾附近的硬编码片。
编码您的代码:
>>> t = (1, 2, 3)
>>> a, b, c = t
>>> a, b, c
(1, 2, 3)
>>> a, *b = t
>>> a, b
(1, [2, 3])
相同的代码:
>>> t = (1, 2, 3)
>>> a, b, c = t
>>> a, b, c
(1, 2, 3)
>>> a, *b = t[0], t[1:]
>>> a, b
(1, [2, 3])
了解更多here。