2012-05-29 14 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的