2016-09-07 94 views
3

从PEP448:请解释*元素,可迭代=构造

虽然*元素,可迭代=引起元件是一个列表,元素= *可迭代,使元件是一个元组。造成这种情况的原因可能会让不熟悉该构造的人感到困惑。

嗯,我是其中的一员。我试了一下:

>>> *e, = range(3) 
>>> e 
[0, 1, 2] 

>>> e = *range(3), 
>>> e 
(0, 1, 2) 

前者在Python 3.4和3.5中工作。

后者只在3.5。这是由PEP448引入的新功能。这在PEP中有描述,没有问题。

但是,我从来没有见过*elements, = iterable之前。你能解释它是如何工作的,为什么它会创建一个列表?

+3

[PEP 3132 - Extended Iterable Unpacking](https://www.python.org/dev/peps/pep-3132/) –

+0

@AshwiniChaudhary完美答案,谢谢。 – VPfB

回答

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

+0

谢谢。你没有回答它为什么会创建一个列表,但是链接的PEP3132在规范部分中说明了它。 – VPfB

+0

我在下面的主要问题:''请解释*元素,= iterable构造''。我会尽力回答,哼哼一声。 – turkus

+0

@ VPfB好的,谢谢。 – turkus