Python star 2.7 版本解包

新手上路,请多包涵

如此 所述,您可以使用星号解包未知数量的变量(如在函数中),但仅限于 python 3:

 >>> 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 中进行未知长度的解包?

原文由 beardc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

在 python 2.X 中,你可以这样做:

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

as long as c has at least one member it will work because if c only has 1 thing in it c[1:] is [] .

您可能应该确保 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

原文由 Andbdrew 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

也是处理 c 为空序列的情况的选项,尽管它不会区分 [None] 和 [] 作为对 a、b 的赋值。所以小心使用它,try / except 可能是最好的。

在处理空容器时,我看不出 Python 3 和 2.7 之间有什么真正的区别,但是 Python 3 的优点在于它适用于任何可迭代对象。

如果你知道 c 是一个生成器,这在 2.7 中有效。

 a,b = c.next(), c

但解包的全部美感似乎需要 Python 3。

原文由 Pete Cacioppi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题