新聞中心
一、copy模塊和深淺復(fù)制
在Python中,對(duì)象的賦值實(shí)際上是對(duì)象的引用,也就是說(shuō),兩個(gè)變量指向同一個(gè)對(duì)象。而有時(shí)候我們希望得到一個(gè)新的對(duì)象,它與原對(duì)象的值相同,但是在內(nèi)存中卻是獨(dú)立的,這時(shí)候就需要使用復(fù)制。Python的copy模塊提供了兩個(gè)函數(shù):copy和deepcopy。淺復(fù)制會(huì)創(chuàng)建一個(gè)新對(duì)象,但它只是原始對(duì)象的一個(gè)副本,如果原始對(duì)象的某個(gè)元素是對(duì)象引用,則新的對(duì)象的相應(yīng)元素也是該對(duì)象的引用。深復(fù)制會(huì)遞歸復(fù)制對(duì)象及其所有子對(duì)象。

十多年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁(yè)制作,對(duì)自上料攪拌車等多個(gè)行業(yè),擁有豐富的營(yíng)銷推廣經(jīng)驗(yàn)。
二、copy方法的使用
copy方法的作用是返回一個(gè)淺復(fù)制了原對(duì)象的新對(duì)象。拿一個(gè)列表作為例子:
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
如果我們改變了列表中的一個(gè)元素,另一個(gè)列表也會(huì)被改變。
list2[0] = 5
print(list1, list2) # [1, 2, [3, 4]], [5, 2, [3, 4]]
但是如果我們改變列表中的嵌套列表的元素,兩個(gè)列表不會(huì)互相影響。
list2[2][0] = 6
print(list1, list2) # [1, 2, [6, 4]], [5, 2, [6, 4]]
三、deepcopy方法的使用
deepcopy方法的作用是返回一個(gè)深復(fù)制了原對(duì)象的新對(duì)象。上面的例子如果我們使用deepcopy:
import copy
list1 = [1, 2, [3, 4]]
list3 = copy.deepcopy(list1)
list3[2][0] = 6
print(list1, list3) # [1, 2, [3, 4]], [1, 2, [6, 4]]
可以看到,兩個(gè)列表的所有元素都完全獨(dú)立,沒(méi)有互相影響。
四、深淺復(fù)制的應(yīng)用
使用深淺復(fù)制可以幫助我們避免修改原始對(duì)象,因此特別適用于以下場(chǎng)景:
1.復(fù)制不定長(zhǎng)的可變列表
以下代碼展示了如何復(fù)制不定長(zhǎng)度的可變列表,這個(gè)列表包含了兩個(gè)子元素:
import copy
list1 = [1, [2, 3], 4]
list2 = copy.copy(list1)
list2[1][0] = 5
print(list1, list2) # [1, [5, 3], 4], [1, [5, 3], 4]
可以看出,當(dāng)我們使用淺復(fù)制時(shí)修改了list2中子列表的元素,list1也會(huì)受到影響。解決這個(gè)問(wèn)題的方法是使用deepcopy:
import copy
list1 = [1, [2, 3], 4]
list3 = copy.deepcopy(list1)
list3[1][0] = 5
print(list1, list3) # [1, [2, 3], 4], [1, [5, 3], 4]
2.復(fù)制復(fù)合對(duì)象
使用深復(fù)制可以復(fù)制復(fù)合對(duì)象,這些對(duì)象由多個(gè)對(duì)象組成并且都是可變的。如果我們使用簡(jiǎn)單的賦值,原對(duì)象和新對(duì)象仍然會(huì)相互影響。以下代碼演示了如何使用deepcopy對(duì)復(fù)合對(duì)象進(jìn)行復(fù)制:
import copy
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
joe = Person('Joe', 30)
jane = Person('Jane', 25)
family1 = [joe, jane]
family2 = copy.deepcopy(family1)
family2[0].age = 35
print(family1[0].age, family2[0].age) # 30, 35
3.刪除列表元素
在Python中使用del語(yǔ)句可以刪除列表元素,但是如果我們只是使用淺復(fù)制,會(huì)出現(xiàn)以下問(wèn)題:
import copy
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
del list2[2][0]
print(list1, list2) # [1, 2, [4]], [1, 2, [4]]
可以看到,原列表也被修改了,因?yàn)閐el語(yǔ)句只是刪除了指向子元素的引用。如果我們使用deepcopy:
import copy
list1 = [1, 2, [3, 4]]
list3 = copy.deepcopy(list1)
del list3[2][0]
print(list1, list3) # [1, 2, [3, 4]], [1, 2, [4]]
可以看到,原列表沒(méi)有受到任何影響。
網(wǎng)頁(yè)題目:創(chuàng)新互聯(lián)Python教程:Python中的copy.deepcopy
網(wǎng)頁(yè)鏈接:http://m.5511xx.com/article/ccdpogh.html


咨詢
建站咨詢
