我理解的可變性,就是內存中的值是否可以改變。如果是不可變的,在對對象本身進行操作時,必須申請內存中的另壹個區域(因為舊區域#是不可變的#),舊區域將被丟棄(如果有其他引用,引用數將減少1,類似於unix下的硬鏈接)。如果是可變的,在對壹個對象進行操作時,不需要在別處申請內存,只需要在對象後連續(+/-)申請,即其地址保持不變,但面積會變長或變短。
不可變類型:字符串、整數、元組
& gt& gt& gtvar1 = 1
& gt& gt& gtvar2 = var1
& gt& gt& gtvar1,var2
(1, 1)
& gt& gt& gtId (var 1)和Id (var 2) #都是指具有相同ID的同壹個內存區域。
(21200672, 21200672)
& gt& gt& gtvar1 += 1
& gt& gt& gtvar1,var2
(2, 1)
& gt& gt& gtId(var1),id(var2)#因為var1和var2的數據是不可變的,var1+1之後,申請另壹個區域,ID (var 1)發生了變化,id(var2)不變。對於該區域,請參考。
(21200660, 21200672)
& gt& gt& gt
變量類型:列表、字典
& gt& gt& gtlst1 =
& gt& gt& gtlst2 = lst1
& gt& gt& gtlst1,lst2
([1, 2, 3], [1, 2, 3])
& gt& gt& gtid(lst1),id(lst2)
(28497360, 28497360)
& gt& gt& gtLst1.append(4)#變量類型,追加後,地址保持不變。
& gt& gt& gtlst1,lst2
([1, 2, 3, 4], [1, 2, 3, 4])
& gt& gt& gtId (lst1),ID (lst2) # lst1,lst2總是指向同壹個區域。
(28497360, 28497360)
& gt& gt& gt
操作這種類型時要特別小心。dict鍵不需要變量類型,函數傳遞參數也不需要變量類型。
例如:
& gt& gt& gtdef dis(arg=[]):
...arg.append('1 ')
...打印參數
...
& gt& gt& gtdis()
['1']
& gt& gt& gtdis()
['1', '1']
& gt& gt& gtdis()
['1', '1', '1']
& gt& gt& gt
有關更多信息,請參考復制模塊。
==結束= =