为什么解压缩元组时var类型会改变?

时间:2019-02-13 07:16:12

标签: python python-3.x list tuples

考虑以下示例:

>>> 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打开元组时为什么会得到列表而不是元组?

3 个答案:

答案 0 :(得分:8)

PEP 3132中所述,这是扩展的可迭代拆包。类型不会“改变”;只是定义了*的解压缩将在所有情况下产生一个列表。

有人建议它产生:

  • 元组而不是列表:
  

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

  • 与右侧相同的类型:
  

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

最终,这些提议被拒绝了。

有关更多信息,请参见herehere

答案 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