用python的人估计都遇到了下面这两个问题:
(0) ValueError : too many values to unpack.
(1) ValueError : need more than n values to unpack.
原因可能大体上是这样的:
当有:var0, var1, ... = val0, val1, ... 或者 iterable
左边的变量个数是m,右边的值/变量的个数是n,当 m < n 时出现Error 0 ,m > n 时出现Error 1。
OK,绕了个圈子,这里说的小技巧和上面的Error的解决或者避免之类的没任何关系,能解决的需求可能是当你就想对iterable的前x个值unpack,或者后x个值unpack时怎么取巧。在函数定义的时候,你可以用*key, **dic 这样的方式让python帮你把变量都收好,但是在unpack的时候就没这么方便了,你需要让等号两边的变量/值的个数配平,不然就会出现上面两个问题。
当然,这并不是什么事,多用几次下标没什么搞不定的。但偶尔换个路线走走,有点小趣味不也是很好的么。当然,这里的问题完全用一下分片的方法list[b, e]可以完美解决。
例子1:假如有一个长度为5的 list ,你就想取最开头的两个值赋给变量,你或许也不想额外产生变量,或者用下标,那么你可以这样做:
b, b, b, b, a = reversed(list)
例子2,:当取最后两个值时,就可以:a, a, a, a, b = list
这个无聊的小技巧我在python2.6, 2.7 下面试了试,没问题。也许很无聊,但却是办到了只用2 个 var 去unpack有5个member的iterable.
我在这里用iterable,除了提示可迭代对象/序列/迭代器的联系之外,更多的就是对python的这种多元“赋值”的理解吧,不管怎么说,底层的实现应该能让它看起来更像是使用for或者iterator那样,逐个赋值,否则上面的操作应该会有问题。其次,这种多元“赋值”能保持类似一种原子操作的方式,可以试试,出现ValueError的时候,前面那些变量不会被赋予等号后面那些值。