更新時(shí)間:2022-10-14 來(lái)源:黑馬程序員 瀏覽量:
1. 淺拷貝
copy函數(shù)是淺拷貝,只對(duì)可變類型的第一層對(duì)象進(jìn)行拷貝,對(duì)拷貝的對(duì)象開辟新的內(nèi)存空間進(jìn)行存儲(chǔ),不會(huì)拷貝對(duì)象內(nèi)部的子對(duì)象。不可變類型的淺拷貝示例代碼:
import copy # 使用淺拷貝需要導(dǎo)入copy模塊 # 不可變類型有: 數(shù)字、字符串、元組 a1 = 123123 b1 = copy.copy(a1) # 使用copy模塊里的copy()函數(shù)就是淺拷貝了 # 查看內(nèi)存地址 print(id(a1)) print(id(b1)) print("-" * 10) a2 = "abc" b2 = copy.copy(a2) # 查看內(nèi)存地址 print(id(a2)) print(id(b2)) print("-" * 10) a3 = (1, 2, ["hello", "world"]) b3 = copy.copy(a3) # 查看內(nèi)存地址 print(id(a3)) print(id(b3))
運(yùn)行上述程序的結(jié)果如下:
140459558944048 140459558944048 ---------- 140459558648776 140459558648776 ---------- 140459558073328 140459558073328
不可變類型的淺拷貝說(shuō)明:
通過(guò)上面的執(zhí)行結(jié)果可以得知,不可變類型進(jìn)行淺拷貝不會(huì)給拷貝的對(duì)象開辟新的內(nèi)存空間,而只是拷貝了這個(gè)對(duì)象的引用。
可變類型的淺拷貝示例代碼:
import copy # 使用淺拷貝需要導(dǎo)入copy模塊 # 可變類型有: 列表、字典、集合 a1 = [1, 2] b1 = copy.copy(a1) # 使用copy模塊里的copy()函數(shù)就是淺拷貝了 # 查看內(nèi)存地址 print(id(a1)) print(id(b1)) print("-" * 10) a2 = {"name": "張三", "age": 20} b2 = copy.copy(a2) # 查看內(nèi)存地址 print(id(a2)) print(id(b2)) print("-" * 10) a3 = {1, 2, "王五"} b3 = copy.copy(a3) # 查看內(nèi)存地址 print(id(a3)) print(id(b3)) print("-" * 10) a4 = [1, 2, [4, 5]] # 注意:淺拷貝只會(huì)拷貝父對(duì)象,不會(huì)對(duì)子對(duì)象進(jìn)行拷貝 b4 = copy.copy(a4) # 使用copy模塊里的copy()函數(shù)就是淺拷貝了 # 查看內(nèi)存地址 print(id(a4)) print(id(b4)) print("-" * 10) # 查看內(nèi)存地址 print(id(a4[2])) print(id(b4[2])) # 修改數(shù)據(jù) a4[2][0] = 6 # 子對(duì)象的數(shù)據(jù)會(huì)受影響 print(a4) print(b4)
運(yùn)行結(jié)果:
139882899585608 139882899585800 ---------- 139882919626432 139882919626504 ---------- 139882919321672 139882899616264 ---------- 139882899587016 139882899586952 ---------- 139882899693640 139882899693640 [1, 2, [6, 5]] [1, 2, [6, 5]]
可變類型的淺拷貝說(shuō)明:
通過(guò)上面的執(zhí)行結(jié)果可以得知,可變類型進(jìn)行淺拷貝只對(duì)可變類型的第一層對(duì)象進(jìn)行拷貝,對(duì)拷貝的對(duì)象會(huì)開辟新的內(nèi)存空間進(jìn)行存儲(chǔ),子對(duì)象不進(jìn)行拷貝。
2. 深拷貝
deepcopy函數(shù)是深拷貝, 只要發(fā)現(xiàn)對(duì)象有可變類型就會(huì)對(duì)該對(duì)象到最后一個(gè)可變類型的每一層對(duì)象就行拷貝, 對(duì)每一層拷貝的對(duì)象都會(huì)開辟新的內(nèi)存空間進(jìn)行存儲(chǔ)。
不可變類型的深拷貝示例代碼:
import copy # 使用深拷貝需要導(dǎo)入copy模塊 # 不可變類型有: 數(shù)字、字符串、元組 a1 = 1 b1 = copy.deepcopy(a1) # 使用copy模塊里的deepcopy()函數(shù)就是深拷貝了 # 查看內(nèi)存地址 print(id(a1)) print(id(b1)) print("-" * 10) a2 = "張三" b2 = copy.deepcopy(a2) # 查看內(nèi)存地址 print(id(a2)) print(id(b2)) print("-" * 10) a3 = (1, 2) b3 = copy.deepcopy(a3) # 查看內(nèi)存地址 print(id(a3)) print(id(b3)) print("-" * 10) # 注意: 元組里面要是有可變類型對(duì)象,發(fā)現(xiàn)對(duì)象有可變類型就會(huì)該對(duì)象到最后一個(gè)可變類型的每一層對(duì)象進(jìn)行拷貝 a4 = (1, ["李四"]) b4 = copy.deepcopy(a4) # 查看內(nèi)存地址 print(id(a4)) print(id(b4)) # 元組里面的可變類型子對(duì)象也會(huì)進(jìn)行拷貝 print(id(a4[1])) print(id(b4[1]))
運(yùn)行結(jié)果:
9289120 9289120 ---------- 140115621848320 140115621848320 ---------- 140115621859592 140115621859592 ---------- 140115602480584 140115621834568 140115602328136 140115602436168
不可變類型的深拷貝說(shuō)明:
通過(guò)上面的執(zhí)行結(jié)果可以得知:
不可變類型進(jìn)行深拷貝如果子對(duì)象沒(méi)有可變類型則不會(huì)進(jìn)行拷貝,而只是拷貝了這個(gè)對(duì)象的引用,否則會(huì)對(duì)該對(duì)象到最后一個(gè)可變類型的每一層對(duì)象就行拷貝, 對(duì)每一層拷貝的對(duì)象都會(huì)開辟新的內(nèi)存空間進(jìn)行存儲(chǔ)
可變類型的深拷貝示例代碼:
import copy # 使用深拷貝需要導(dǎo)入copy模塊 # 可變類型有: 列表、字典、集合 a1 = [1, 2] b1 = copy.deepcopy(a1) # 使用copy模塊里的deepcopy()函數(shù)就是深拷貝了 # 查看內(nèi)存地址 print(id(a1)) print(id(b1)) print("-" * 10) a2 = {"name": "張三"} b2 = copy.deepcopy(a2) # 查看內(nèi)存地址 print(id(a2)) print(id(b2)) print("-" * 10) a3 = {1, 2} b3 = copy.deepcopy(a3) # 查看內(nèi)存地址 print(id(a3)) print(id(b3)) print("-" * 10) a4 = [1, 2, ["李四", "王五"]] b4 = copy.deepcopy(a4) # 使用copy模塊里的deepcopy()函數(shù)就是深拷貝了 # 查看內(nèi)存地址 print(id(a4)) print(id(b4)) # 查看內(nèi)存地址 print(id(a4[2])) print(id(b4[2])) a4[2][0] = "王五" # 因?yàn)榱斜淼膬?nèi)存地址不同,所以數(shù)據(jù)不會(huì)收到影響 print(a4) print(b4)
運(yùn)行結(jié)果:
140348291721736 140348291721928 ---------- 140348311762624 140348311221592 ---------- 140348311457864 140348291752456 ---------- 140348291723080 140348291723144 140348291723208 140348291723016 [1, 2, ['王五', '王五']] [1, 2, ['李四', '王五']]
可變類型的深拷貝說(shuō)明:
通過(guò)上面的執(zhí)行結(jié)果可以得知, 可變類型進(jìn)行深拷貝會(huì)對(duì)該對(duì)象到最后一個(gè)可變類型的每一層對(duì)象就行拷貝, 對(duì)每一層拷貝的對(duì)象都會(huì)開辟新的內(nèi)存空間進(jìn)行存儲(chǔ)。
不管是給對(duì)象進(jìn)行深拷貝還是淺拷貝,只要拷貝成功就會(huì)開辟新的內(nèi)存空間存儲(chǔ)拷貝的對(duì)象。淺拷貝和深拷貝的區(qū)別是:淺拷貝最多拷貝對(duì)象的一層,深拷貝可能拷貝對(duì)象的多層。