本文引用至:赋值trick
python 让世人震惊的就是他的灵活, 他的灵活不仅表现在他各种各样的包, 更表现在他深层次的语法当中.
比如, 赋值魔法就是一个很nice的trick.
sequence unpacking
序列解包, 在py中,用途真的很广.
当在等号一边使用多个值时, 会默认将值转化为元组:
>>> tup = 1,2,3,
>>> tup
(1, 2, 3)
如果你两边都对应相同的值的话, 就会发生sequence unpacking. 意思就是,再将元组给拆分开, 进行赋值.
>>> a,b,c = 1,2,3
>>> print('''
... a is {0}
... b is {1}
... c is {2}'''.format(a,b,c))
a is 1
b is 2
c is 3
另外, 还可以进行元组的嵌套. 比如:
>>> (a,b),c = (1,2),3
// 结果和上面一致
该种赋值叫做序列解包, 序列有两种,一种为tuple 一种为list. 那list能不能行呢?
试一试
>>> a,b = [1,2]
没有报错, 说明对于list而言,这种赋值也是可行的.
另外, 在python3.x中,还提出一种extended unpacking(拓展解包).
他的作用就是使用*
来收集剩下的内容,并且转换为list. 因为上面的序列解包, 等号两边必须顺序都是对应的. 所以, 如果你只想获得前两个, 那么拓展解包就很合适了.
>>> *a,b = 1,2
// a:[1], b:2
不过,这里需要注意下面
你不能单独使用
*
: 比如>>> *a = 1,2
这是会报错的. 因为解包的要求,两边必须是元组,你进行单个赋值,这样的结果估计就go die了.
所以,你可以这样使用:*a,=1,2
这样就没问题了. 先将*a
转变为tuple, 然后再进行解包.
那, 这到底有什么用呢?
除了上面所说的多变量赋值外, 解包还可以用来 进行变量的交换, 直接获取函数的返回值.
变量交换
直接看demo吧:
>>> a
[1]
>>> b
2
>>> a,b = b,a
只要交换位置即可, 编译器内部会帮我们自动进行中间量的添加.
获取函数返回值
这个就不用多说了. 就相当于变量的直接复制.比如, dict中的popitem方法, 他会随机删除掉一个key/value pair. 所以,如果你想获取删除的值就可以这样写:
>>> new_dict
{1: 0, 2: 0, 3: 0, 4: 0}
>>> key,value = new_dict.popitem()
chained assignment
上面的解包代表的是一一映射的关系, 在py中,我们还可以使用它的链式赋值,相当于一对多的关系.
>>> a = b = 2
看个总结: