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

十多年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個人網(wǎng)站制作服務,為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設計流程、步驟,成功服務上千家企業(yè)。為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制高端網(wǎng)站建設服務,專注于成都定制網(wǎng)站,高端網(wǎng)頁制作,對自上料攪拌車等多個行業(yè),擁有豐富的營銷推廣經(jīng)驗。
二、copy方法的使用
copy方法的作用是返回一個淺復制了原對象的新對象。拿一個列表作為例子:
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
如果我們改變了列表中的一個元素,另一個列表也會被改變。
list2[0] = 5
print(list1, list2) # [1, 2, [3, 4]], [5, 2, [3, 4]]
但是如果我們改變列表中的嵌套列表的元素,兩個列表不會互相影響。
list2[2][0] = 6
print(list1, list2) # [1, 2, [6, 4]], [5, 2, [6, 4]]
三、deepcopy方法的使用
deepcopy方法的作用是返回一個深復制了原對象的新對象。上面的例子如果我們使用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]]
可以看到,兩個列表的所有元素都完全獨立,沒有互相影響。
四、深淺復制的應用
使用深淺復制可以幫助我們避免修改原始對象,因此特別適用于以下場景:
1.復制不定長的可變列表
以下代碼展示了如何復制不定長度的可變列表,這個列表包含了兩個子元素:
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]
可以看出,當我們使用淺復制時修改了list2中子列表的元素,list1也會受到影響。解決這個問題的方法是使用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.復制復合對象
使用深復制可以復制復合對象,這些對象由多個對象組成并且都是可變的。如果我們使用簡單的賦值,原對象和新對象仍然會相互影響。以下代碼演示了如何使用deepcopy對復合對象進行復制:
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語句可以刪除列表元素,但是如果我們只是使用淺復制,會出現(xiàn)以下問題:
import copy
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
del list2[2][0]
print(list1, list2) # [1, 2, [4]], [1, 2, [4]]
可以看到,原列表也被修改了,因為del語句只是刪除了指向子元素的引用。如果我們使用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]]
可以看到,原列表沒有受到任何影響。
文章名稱:創(chuàng)新互聯(lián)Python教程:Python中的copy.deepcopy
網(wǎng)站路徑:http://m.fisionsoft.com.cn/article/ccdpogh.html


咨詢
建站咨詢
