Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 赋值语句左侧与右侧的星形*运算符_Python_Python 3.x_Iterable_Iterable Unpacking - Fatal编程技术网

Python 赋值语句左侧与右侧的星形*运算符

Python 赋值语句左侧与右侧的星形*运算符,python,python-3.x,iterable,iterable-unpacking,Python,Python 3.x,Iterable,Iterable Unpacking,据我所知,这个问题源于Python3.5,并存在于Python3.5中(而不是向后移植到2.x)。具体而言,在“缺点”一节中,注意以下几点: 当*元素时,=iterable使元素成为列表, elements=*iterable,使elements成为元组。其原因可能会使不熟悉该结构的人感到困惑 对于iterable=[1,2,3,4],第一种情况会产生一个列表: >>> *elements, = iterable >>> elements [1, 2, 3,

据我所知,这个问题源于Python3.5,并存在于Python3.5中(而不是向后移植到
2.x
)。具体而言,在“缺点”一节中,注意以下几点:

*元素时,=iterable
使
元素
成为
列表
elements=*iterable
,使
elements
成为
元组。其原因可能会使不熟悉该结构的人感到困惑

对于
iterable=[1,2,3,4]
,第一种情况会产生一个
列表:

>>> *elements, = iterable
>>> elements
[1, 2, 3, 4]
而对于第二种情况,将创建一个
元组

>>> elements = *iterable,
>>> elements
(1, 2, 3, 4)

由于不熟悉这个概念,我感到困惑。有人能解释这种行为吗?星号表达式的作用是否因其所在的侧面而异?

在考虑扩展解包的初始PEP时,将解释这两种情况之间的差异:

在该政治公众人物的摘要中,我们可以看到:

本PEP建议对iterable解包语法进行更改,允许指定一个“全面”名称,该名称将被分配一个未分配给“常规”名称的所有项目的列表

(强调矿山)

因此在第一种情况下,执行后:

*elements, = iterable
元素
总是一个
列表
,包含
iterable
中的所有项目

尽管这两种情况看起来很相似,但本例中的
*
表示:捕获未分配给名称的所有内容,并将其分配给带星号的表达式。它的工作方式与函数定义中的
*args
**kwargs
类似

def spam(*args, **kwargs): 
    """ args and kwargs group positional and keywords respectively """
第二种情况(右侧)有些不同。在这里,我们没有像在函数调用中那样让
*
以“捕获一切”的方式工作。它扩展了它所附加到的iterable的内容。因此,声明:

elements = *iterable, 
可以看作:

elements = 1, 2, 3, 4, 
这是初始化
元组的另一种方法

请注意,只需使用
元素=[*iterable]
即可创建
列表
,将
iterable
的内容解压缩,并生成
元素=[1,2,3,4]
形式的赋值