Python 为什么在解包元组时var类型会改变?
考虑这个例子:Python 为什么在解包元组时var类型会改变?,python,python-3.x,list,tuples,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解包元组时,为什么我会得到一个列表而不是元组?您可以在这个链接中找到更多信息,但我认为这本质上是因为这是一个通用的iterable解包,所以它首先将事物转换为列表来处理通用情况: 此外,如果右
>>> 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
解包元组时,为什么我会得到一个列表而不是元组?您可以在这个链接中找到更多信息,但我认为这本质上是因为这是一个通用的iterable解包,所以它首先将事物转换为列表来处理通用情况:
此外,如果右边的值不是列表,而是一个iterable,则它具有
在能够执行切片之前转换为列表
我认为元组是一种特殊情况,在这种情况下,实现可以允许它作为元组返回,因为元组已经允许切片,但看起来决定在这种情况下实现最通用的版本。如中所述,这是扩展的iterable解包。类型没有“改变”;只是定义了*
解包将在所有情况下生成一个列表
建议其产生:
- 元组而不是列表:
*args
一致,但会使结果的进一步处理更加困难
- 与右侧相同的类型:
a中的b
,*b='hello'
将分配字符串'ello'
。这似乎很好,但不可能在所有iterables中都保持正确
最终,这些建议被否决
有关更多信息,请参见和。在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])
阅读更多