日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝

發(fā)布時(shí)間:2024/7/5 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文翻譯自copy in Python (Deep Copy and Shallow Copy),講述了在Python語(yǔ)言中淺拷貝與深拷貝的不同用法。全文系作者原創(chuàng),僅供學(xué)習(xí)參考使用,轉(zhuǎn)載授權(quán)請(qǐng)私信聯(lián)系,否則將視為侵權(quán)行為。碼字不易,感謝支持。以下為全文內(nèi)容:


在Python中,賦值語(yǔ)句不復(fù)制對(duì)象,它們只是在目標(biāo)和對(duì)象之間創(chuàng)建綁定。當(dāng)我們使用=運(yùn)算符時(shí),用戶認(rèn)為這會(huì)創(chuàng)建一個(gè)新對(duì)象;好吧,其實(shí)并沒(méi)有。它只創(chuàng)建一個(gè)共享原始對(duì)象引用的新變量。有時(shí)用戶想要使用可變對(duì)象,為了做到這一點(diǎn),用戶希望找到創(chuàng)建這些對(duì)象的“真實(shí)副本”或“克隆”的方法。或者,有時(shí)用戶想要一個(gè)可以被修改的副本而不會(huì)同時(shí)自動(dòng)修改原件,為此,我們需要?jiǎng)?chuàng)建對(duì)象的副本。

拷貝在某些情況下是需要的,從而能讓我們?cè)谛薷母北镜耐瑫r(shí)不改動(dòng)原始對(duì)象。在Python中有兩種創(chuàng)建拷貝的方式:

  • 深拷貝
  • 淺拷貝

為了進(jìn)行拷貝操作,我們需要引用copy模塊。我們使用copy模塊進(jìn)行淺拷貝和深拷貝的操作,例如:

# importing copy module import copy # initializing list 1 li1 = [1, 2, [3,5], 4] # using copy for shallow copy li2 = copy.copy(li1) # using deepcopy for deepcopy li3 = copy.deepcopy(li1)

在上述代碼中,copy()函數(shù)返回了一個(gè)鏈表的淺拷貝而deepcopy()函數(shù)返回了一個(gè)鏈表的深拷貝。


進(jìn)行深拷貝時(shí)會(huì)遞歸地執(zhí)行對(duì)象的拷貝過(guò)程。這意味著它首先創(chuàng)建一個(gè)新的集合對(duì)象,然后遞歸地使用原始對(duì)象中所有子對(duì)象的拷貝來(lái)填充這個(gè)新的集合對(duì)象。在深拷貝中,一個(gè)對(duì)象會(huì)被完整地復(fù)制到另一個(gè)對(duì)象中。這意味著發(fā)生在新對(duì)象中的所有修改都不會(huì)影響到原始對(duì)象。觀察下面的代碼:

# Python code to demonstrate copy operations # importing "copy" for copy operations import copy # initializing list 1 li1 = [1, 2, [3,5], 4] # using deepcopy to deep copy li2 = copy.deepcopy(li1) # original elements of list print ("The original elements before deep copying") for i in range(0,len(li1)): print (li1[i],end=" ") print("r") # adding and element to new list li2[2][0] = 7# Change is reflected in l2 print ("The new list of elements after deep copying ") for i in range(0,len( li1)): print (li2[i],end=" ") print("r") # Change is NOT reflected in original list # as it is a deep copy print ("The original elements after deep copying") for i in range(0,len( li1)): print (li1[i],end=" ")

Output:

The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4

在上面的例子中,在新的鏈表中發(fā)生的修改并不會(huì)反映在原始的鏈表中,表明這是一個(gè)深拷貝的操作。

一個(gè)淺拷貝意味著創(chuàng)建一個(gè)新的集合對(duì)象并用原始對(duì)象中子對(duì)象的引用來(lái)填充新對(duì)象。拷貝的過(guò)程并不是遞歸的,因此不會(huì)創(chuàng)建子對(duì)象的拷貝。對(duì)于淺拷貝來(lái)說(shuō),是在另一個(gè)對(duì)象中創(chuàng)建了對(duì)象的引用。這意味著對(duì)新對(duì)象采取的所有修改也會(huì)同時(shí)影響原來(lái)的對(duì)象。比如:

# Python code to demonstrate copy operations # importing "copy" for copy operations import copy # initializing list 1 li1 = [1, 2, [3,5], 4] # using copy to shallow copy li2 = copy.copy(li1) # original elements of list print ("The original elements before shallow copying") for i in range(0,len(li1)): print (li1[i],end=" ") print("r") # adding and element to new list li2[2][0] = 7# checking if change is reflected print ("The original elements after shallow copying") for i in range(0,len( li1)): print (li1[i],end=" ")

Output:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4

在上例中,在新的鏈表中的修改使得原始鏈表也被同時(shí)修改了,表明這是一個(gè)淺拷貝操作。

注意事項(xiàng):

淺拷貝和深拷貝之間的區(qū)別僅與復(fù)合對(duì)象有關(guān)(指那些本身包含了其他對(duì)象的對(duì)象,比如鏈表或者類的實(shí)例):

  • 淺拷貝構(gòu)造一個(gè)新的復(fù)合對(duì)象,然后(盡可能)將對(duì)它的引用插入到原始對(duì)象中。
  • 深拷貝構(gòu)造一個(gè)新的復(fù)合對(duì)象,然后遞歸地將復(fù)制對(duì)象插入到原始對(duì)象中找到的對(duì)象中。

以上就是本文的全部?jī)?nèi)容,如果您喜歡這篇文章,歡迎將它分享給朋友們。

感謝您的閱讀,祝您生活愉快!

作者:小美哥
2019-03-17

總結(jié)

以上是生活随笔為你收集整理的clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。