封装:当等号的右边出现以逗号分隔的多个值时,会自动封装到元组当中,这个过程就叫封装(packing)
解构:等式左侧为多个以逗号分隔的标识符与等号右侧的容器中的数据一一对应时,这个操作就叫解构(unpacking)
>>> t=1,2 #自动完成封装
>>> print(type(t))
<class 'tuple'>
>>> x,y = (1,2) #x,y自动完成赋值,这个过程是先解构,然后一一赋值
>>> print(x)
>>> print(y)
封装和解构是非常方便的提取数据的方式,Python
和JavaScript
中应用很广泛
常规变量交换 vs 封装与解构
#变量交换
x = 10
y = 11
t = x
x = y
y = t
#封装与解构
x = 10
y = 11
x,y = y,x
简单解构
解构时,左右两侧的标识符与值的数量必须一致
a,b = (1,2)
a,b = 1,2
a,b = [1,2]
a,b = {1,2} #对于非线性结构也可以解构
a,b = {'x':10,'y':11} #赋值给a,b的是字典中的key,而不是键值对
(a,b) = 1,2
[a,b] = (1,2)
{a,b} = {10,20} ##这个会报错,因为a,b是在集合中的,元素不能进行赋值
a,b = (10,20,30) #报ValueError
剩余变量解构
剩余变量解构使用"*标识符"来表示,这样在解构的同时此标识符能够尽可能多地收集等号右侧的值
>>> a,*b,c = [1,2,3,4,5,6] #标识符b会尽可能收集最多的值,除了a,c各占一个之外,其余的都给了b
>>> print(a,b,c)
1 [2, 3, 4, 5] 6
>>> print(type(b))
<class 'list'>
单独使用剩余变量则不行:
>>> *a = [1,2,3,4]
SyntaxError: starred assignment target must be in a list or tuple
相同变量会被最后一个值覆盖
>>> a,b,a = [1,2,3]
>>> print(a)
3