解包赋值是一个方便代码编写的语法特性,在一个赋值语句中可将右边表达式的值自动解开赋值给左边,如:
首先,计算右边的表达式,以及左边的各左值元素中的需计算部分(如果有的话,比如a[i + 1], b = t),而这两者的计算顺序则根据语言定义
其次,根据左边的元素数量,将右边表达式转换为对应大小的数组,转换过程是直接迭代,换句话说,右边的表达式不一定需要是一个tuple/list/dict/set等,只要可迭代就行;转换完后,需要检查数量和数组大小的一致性,即上例中,假如t的元素不为2个,无论多余或少于,都会报异常
最后,将对应位置的左值和数组元素做赋值操作,需要注意的是,这个赋值不仅可以是简单赋值,也可以有解包操作,例如:
这个语法的好处在于可以让代码简单明了,尤其是在循环语句中:
a, b = t
简单看上去相当于:
a = t[0]
b = t[1]
不过若t的位置是一个表达式,则下面这样做就必须用一个临时变量来防止重复求值,事实上这个代码和解包并不等价,解包赋值的具体步骤更复杂一点:
首先,计算右边的表达式,以及左边的各左值元素中的需计算部分(如果有的话,比如a[i + 1], b = t),而这两者的计算顺序则根据语言定义
其次,根据左边的元素数量,将右边表达式转换为对应大小的数组,转换过程是直接迭代,换句话说,右边的表达式不一定需要是一个tuple/list/dict/set等,只要可迭代就行;转换完后,需要检查数量和数组大小的一致性,即上例中,假如t的元素不为2个,无论多余或少于,都会报异常
最后,将对应位置的左值和数组元素做赋值操作,需要注意的是,这个赋值不仅可以是简单赋值,也可以有解包操作,例如:
a, (b, c) = t
t中有两个元素,第一个赋给a,第二个对b,c再做一次解包
这个语法的好处在于可以让代码简单明了,尤其是在循环语句中: