淺拷貝只會拷貝一層,而深拷貝會逐層拷貝,直到拷貝的所有引用都是不可變引用為止叠萍。
1 拷貝內(nèi)容為可變類型
1.=
指向原地址
2.copy.copy
會開辟一個新的空間绪商,內(nèi)部拷貝了可變類型的引用
3.copy.deepcopy
所有元素都拷貝
print("淺拷貝:")
import copy
b=[[1,0],2,3,4,5]
a = b;
print("id b:",id(b))
h=copy.copy(b)
g=copy.deepcopy(b)
print("id h",id(h))
print(h)
a.append(10)
h.append(6)
print(h)
print("id h",id(h))
print(b) #淺拷貝新的列表h改變了,原來的b沒變格郁。
b[1]='n' #列表元素改變后腹殿,新的列表也沒變
b.append(12)
print(b)
print(h)
b[0][1]=77 #淺拷貝只拷貝一層
print(b)
print(h)
print(g) #深拷貝層層拷貝
1.1 對象類型
任意一個對象都有3個屬性独悴,類型,身份刻炒,值
a = (1,)
print(type(a))
print(id(a))
print(a)
根據(jù)對象的值可不可變,對象可以分為可變對象和不可變對象坟奥。
1.2 可變對象
-列表
-字典
-集合
身份不可變。
1.3 不可變對象
-數(shù)字
-字符串
-元組
身份和值都不可變拇厢。
字典的key只能是不可變對象爱谁。
新創(chuàng)建的對象被關(guān)聯(lián)到原來的變量名刚梭,舊對象被丟棄凰慈,垃圾回收器會在適當(dāng)?shù)臅r機回收這些對象碉考。
2 拷貝內(nèi)容為不可變類型
無論是簡單賦值=升酣,還是copy.copy還是copy.deepcopy狸膏,都只是簡單的引用迅涮,不會開辟新的空間。
print("拷貝不可變類型:")
import copy
b = (1,)
a = b;
print("id b:",id(b))
print("id a:",id(b))
h=copy.copy(b)
g=copy.deepcopy(b)
print("id h",id(h))
print("id g",id(h))
拷貝不可變類型:
('id b:', 139847412495568)
('id a:', 139847412495568)
('id h', 139847412495568)
('id g', 139847412495568)
2.1 引用
每個對象都會在內(nèi)存中申請開辟一塊空間來保存該對象叮姑,該對象在內(nèi)存中所在位置的地址就稱為引用。
在開發(fā)程序時传透,變量名就是對象的地址引用极颓。
引用實際就是內(nèi)存中的一個數(shù)字地址編號,在使用對象時兵琳,只要知道這個對象的地址,就可以操作這個對象躯肌,但是因為這個數(shù)字地址不方便在開發(fā)時使用和記憶破衔,所以使用變量名的形式來代替對象的數(shù)字地址清女。在Python中晰筛,變量就是地址的一種表示形式忠售,并不開辟開辟存儲空間迄沫。
3 拷貝內(nèi)容為不可變類型但包含可變類型
=和copy.copy是引用卦方,不開辟新的地址羊瘩。
但是copy.deepcopy不同盼砍,只要拷貝對象中包含可變元素,就會開辟新的地址浇坐,完全拷貝。
4 列表切片中的拷貝
都是淺拷貝近刘,也就是說雖然開辟新的地址,但是存放的是引用觉渴。
5 字典中的拷貝
淺拷貝
字典中存儲的是key的引用
6 列表作為函數(shù)參數(shù)傳入
作為參數(shù)傳入也是淺拷貝