Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在解包元组时var类型会改变?_Python_Python 3.x_List_Tuples - Fatal编程技术网

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
一致,但会使结果的进一步处理更加困难

  • 与右侧相同的类型:
尝试为带星号的目标指定与源iterable相同的类型,例如,
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])
阅读更多