2013-07-25 72 views
-2

,因爲我不知道如何元組拆包是工作,我已經在多個線程發現這個答案來替代切片:我不明白怎麼元組拆包作品(Python的2.X)

>>>>def unpack(first,*rest): 
    return first, rest 

其工作原理如下:

>>>>first,rest=unpack(*(1,2,3)) 
>>>>first 
1 
>>>>rest 
(2,3) 

我不明白*的工作原理。 「first」這個參數不應該給我的函數解包?我認爲*意味着這個論點是可選的。

感謝您的幫助

+5

你在這裏混合的概念。 'unpack()'的返回值被解壓到'first'和'rest'(元組解包)中。 'unpack()'函數簽名有一個splat-syntax catch-all參數'rest'。第三,您正在使用函數調用功能將序列擴展爲位置參數。 **這些是3件獨立的事情**。 –

+0

是的,我明白我正在使用函數調用功能。我不明白的是,解壓縮(*(1,2,3))相當於解壓縮(1,2,3) –

回答

3

*在函數定義並不意味着可選;它意味着「打包調用者提供給元組的任何額外(非關鍵字)參數,並將元組放在這裏」。類似地,函數調用中的*意味着「解壓縮這些事情序列並將所有元素作爲參數單獨提供給函數」。

unpack(*(1,2,3)) 

解壓(1,2,3)並呼籲

unpack(1,2,3) 

1被分配到first,而其餘的參數23被打包成一個元組並分配給rest

+0

這比上面的答案更清晰!我沒有意識到函數定義中的 * 和函數調用中的 * 之間存在差異。謝謝 ! –

1

在你的情況,unpack(*(1,2,3))只是unpack(1, 2, 3)

解壓縮的實現需要第一個參數和一個args故事,然後將它作爲一個元組返回。

星語法是非常有用的,如果你想傳遞參數作爲變量:

a = (1, 2, 3) 
first, rest = unpack(*a) 
+0

好吧,我明白了,謝謝。我沒有意識到這兩個是相當的,第二個表述更清楚。 –

相關問題