来自PEP448:
虽然* elements,= iterable导致元素成为列表,但= = * iterable,使元素成为元组。造成这种情况的原因可能会使不熟悉构造的人感到困惑。
嗯,我是其中一个人。我试了一下:
RuntimeException
前者适用于Python 3.4和3.5。
后者仅在3.5。这是上述PEP448引入的新功能。它在PEP中描述,没有问题。
但是,我以前从未见过>>> *e, = range(3)
>>> e
[0, 1, 2]
>>> e = *range(3),
>>> e
(0, 1, 2)
。你能解释它是如何工作的以及它为什么创建一个列表吗?
答案 0 :(得分:5)
是的,这是一项新功能。好吧,这是因为需要打开列表的“其余”。那么,看看这些例子:
>>> a, *e = range(3)
>>> print(a, e)
0 [1, 2]
>>> a, *e, b = range(3)
>>> print(a, e, b)
0 [1] 2
现在你的例子:
>>> *e, = range(3)
>>> print(e)
[0, 1, 2]
相当于:
>>> (*e,) = range(3)
>>> print(e)
[0, 1, 2]
这样逗号只是为了使它成为一个可迭代的元素(*e,)
。因此,python知道range(3)
的“其余部分”应放入e
,在这种情况下[0, 1, 2]
的整数值。
否则使用:
>>> *e = range(3)
File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple
它不起作用。
link下的其余解释。