2012-05-29 13 views
24

如前所述here,您可以使用星拆包未知數量的變量(如函數),但只在Python 3:Python的明星拆包2.7版

>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

在Python 2.7版,最好的我能想出的(並不可怕,但煩人):

c = (1, 2, 3) 
a, b = c[0], c[1:] if len(c) > 1 else [] 

有沒有辦法從__future__像師導入此,或者我需要我自己的函數做未知長度拆包在Python 2.7?

+4

號這是爲數不多的Py3k *僅*特點之一。 – JBernardo

+1

它被稱爲擴展拆包 –

回答

25

在Python 2.X,你可以這樣做:

c = (1, 2, 3) 
a, b = c[0], c[1:] 

只要c至少有一個成員會因爲工作,如果c只有一樣東西在裏面c[1:][]

雖然您應該確定至少有一件東西在c之內,否則c[0]會引發異常。

你可以這樣做:

try: 
    c = tuple(c) 
    a, b = c[0], c[1:] 
except TypeError, IndexError: 
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it. 
    # do something else 
    pass 
+3

只有'c'是一個序列。解包與任何迭代一起工作,所以對於完整的解決方案,首先執行'c = tuple(c)'。這完全模擬了行爲,包括掛在無限次迭代上。但是,你仍然必須更加努力地工作,達到'a,* b,c = range(10)';但是沒有真正的解決方法。 – lvc

+0

@lvc好點。我編輯了我的答案。 – Andbdrew

+2

@ lvc男人,那'a,* b,c =範圍(10)'很酷! – Andbdrew

2
(a,b) = (None, []) if not len(c) else (c[0], c[1:]) 

也處理其中c爲空序列的情況下一種選擇,雖然它不會[無]區分和[]中的術語作爲a,b的分配。所以小心使用它,嘗試/除了可能是最好的。

在處理空容器時,我看不到Python 3和2.7之間的真正區別,但是Python 3的好處在於它適用於任何迭代。

這工作在2.7,如果你知道c是一個發電機。

a,b = c.next(), c 

但拆包的充滿美感似乎需要Python 3的