2016-09-07 62 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