Python 赋值语句左侧与右侧的星形*运算符
据我所知,这个问题源于Python3.5,并存在于Python3.5中(而不是向后移植到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,
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]
形式的赋值