封裝:當等號的右邊出現以逗號分隔的多個值時,會自動封裝到元組當中,這個過程就叫封裝(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