这个问题源于PEP 448 -- Additional Unpacking Generalizations,据我所知,它出现在python 3.5中(而不是返回到2.x)。具体来说,在“缺点”一节中,注意到以下几点:
*elements, = iterable导致elements成为list
使elements = *iterable成为elements。这样做的原因可能会使不熟悉该结构的人感到困惑。
确实如此,对于tuple,第一种情况会产生一个iterable = [1, 2, 3, 4]

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

对于第二种情况,会创建一个list
>>> elements = *iterable,
>>> elements
(1, 2, 3, 4)

由于不熟悉这个概念,我感到困惑。有人能解释这种行为吗?根据所处的位置,加星号的表达方式是否会有所不同?

最佳答案

在考虑扩展解包的初始PEP时,解释了这两种情况之间的区别:PEP 3132 -- Extended iterable unpacking
在该政治公众人物的摘要中,我们可以看到:
此PEP建议更改ITerable解包语法,允许指定一个“catch all”名称,该名称将被分配一个未分配给“regular”名称的所有项目的列表。
(强调我的)
因此,在第一种情况下,在执行之后:

*elements, = iterable

elements始终是包含list中所有项目的iterable
尽管在这两种情况下看起来都很相似,但在本例中(左侧)的*意味着:捕获未分配给名称的所有内容,并将其分配给带星号的表达式。它的工作方式与函数定义中的*args**kwargsdo类似。
def spam(*args, **kwargs):
    """ args and kwargs group positional and keywords respectively """

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

可以被视为:
elements = 1, 2, 3, 4,

这是初始化tuple的另一种方法。
请注意,只需使用list就可以创建一个elements = [*iterable],它将解压缩iterable中的[]内容,并生成一个elements = [1, 2, 3, 4]形式的赋值。

关于python - 赋值语句左侧与右侧的Star *运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35636785/

10-12 21:22