赋值语句左、右的星*运算符

2024-10-01 07:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题源于^{} -- Additional Unpacking Generalizations,据我所知,它在Python3.5中存在(并且没有向后移植到2.x)。具体而言,在缺点一节中,注意到以下几点:

Whilst *elements, = iterable causes elements to be a list, elements = *iterable, causes elements to be a tuple. The reason for this may confuse people unfamiliar with the construct.

对于iterable = [1, 2, 3, 4],第一种情况下产生list

>>> *elements, = iterable
>>> elements
[1, 2, 3, 4]

对于第二种情况,将创建tuple

^{pr2}$

由于不熟悉这个概念,我很困惑。有人能解释这种行为吗?带星号的表情是否因其所在的侧面而有所不同?在


Tags: theto情况elementsbeiterablelistadditional
1条回答
网友
1楼 · 发布于 2024-10-01 07:21:46

这两种情况的区别在考虑扩展解包的初始PEP时得到了解释:^{}。在

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

This PEP proposes a change to iterable unpacking syntax, allowing to specify a "catch-all" name which will be assigned a list of all items not assigned to a "regular" name.

(重点是我的)

所以在第一种情况下,在执行之后:

*elements, = iterable

elements始终是一个list,包含{}中的所有项。在

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

^{pr2}$

第二种情况(右侧)有些不同。在这里,*不像通常在函数调用中那样以“捕捉一切”的方式工作。它扩展了它所附加的iterable的内容。所以,声明:

elements = *iterable, 

可以看作:

elements = 1, 2, 3, 4, 

这是初始化tuple的另一种方法。在

请注意,list可以通过简单的使用elements = [*iterable]来创建,它将把iterable的内容解压到{}中,并得到形式为elements = [1, 2, 3, 4]的赋值。在

相关问题 更多 >