这个问题源于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
和**kwargs
do类似。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/