2016-02-25 94 views
6

這個問題源於PEP 448 -- Additional Unpacking Generalizations,並且在我知道的情況下(並且沒有移植到2.x)出現在Python 3.5中。具體地,在部分缺點,下面指出:Star *運算符左側和右側的賦值語句

雖然*elements, = iterable原因elements是一個listelements = *iterable,導致elements是一個tuple。造成這種情況的原因可能會使不熟悉該構造的人感到困惑。

這確實成立,爲iterable = [1, 2, 3, 4],第一種情況下產生一個list

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

雖然創建tuple第二種情況:

>>> elements = *iterable, 
>>> elements 
(1, 2, 3, 4) 

作爲陌生的概念, 我很困惑。誰能解釋這種行爲?根據所在的一面,星號表達的行爲是否有所不同?

回答

6

這兩種情況之間的區別也在考慮初始PEP的情況下進行解釋:PEP 3132 -- Extended iterable unpacking

在抽象爲PEP我們可以看到:

這PEP提出更改可迭代拆包語法,允許指定將被分配一個列表一個「包羅萬象」的名字所有未分配到「常規」名稱的項目均爲

(重點煤礦)

所以在第一種情況下,執行後

*elements, = iterable 

elements總是將是包含在所有項目一listiterable

儘管在這兩種情況下看起來都很相似,但在這種情況下(左側)的*表示:捕獲未分配給名稱的所有內容並將其分配給帶星號的表達式。它的工作方式與*args**kwargs類似,功能定義

def spam(*args, **kwargs): 
    """ args and kwargs group positional and keywords respectively """ 

第二種情況(右側)有一定的差別。在這裏,我們沒有*工作在「捕捉所有」方式,就像我們在函數調用中通常那樣工作。它擴展了它所附帶的可迭代的內容。所以,以下語句:

elements = *iterable, 

可以被看作是:

elements = 1, 2, 3, 4, 

這是另一種方式的tuple被初始化。

待辦事項,一個list可以通過使用elements = [*iterable]將解壓的iterable的內容[]並導致形式elements = [1, 2, 3, 4]的分配簡單的創建。