python浅拷贝_Python中的浅拷贝和深拷贝
本文翻譯自copy in Python (Deep Copy and Shallow Copy),講述了在Python語言中淺拷貝與深拷貝的不同用法。全文系作者原創(chuàng),僅供學(xué)習(xí)參考使用,轉(zhuǎn)載授權(quán)請(qǐng)私信聯(lián)系,否則將視為侵權(quán)行為。碼字不易,感謝支持。以下為全文內(nèi)容:
在Python中,賦值語句不復(fù)制對(duì)象,它們只是在目標(biāo)和對(duì)象之間創(chuàng)建綁定。當(dāng)我們使用=運(yùn)算符時(shí),用戶認(rèn)為這會(huì)創(chuàng)建一個(gè)新對(duì)象;好吧,其實(shí)并沒有。它只創(chuàng)建一個(gè)共享原始對(duì)象引用的新變量。有時(shí)用戶想要使用可變對(duì)象,為了做到這一點(diǎn),用戶希望找到創(chuàng)建這些對(duì)象的“真實(shí)副本”或“克隆”的方法?;蛘?#xff0c;有時(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ì)象的拷貝過程。這意味著它首先創(chuàng)建一個(gè)新的集合對(duì)象,然后遞歸地使用原始對(duì)象中所有子對(duì)象的拷貝來填充這個(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ì)象的引用來填充新對(duì)象。拷貝的過程并不是遞歸的,因此不會(huì)創(chuàng)建子對(duì)象的拷貝。對(duì)于淺拷貝來說,是在另一個(gè)對(duì)象中創(chuàng)建了對(duì)象的引用。這意味著對(duì)新對(duì)象采取的所有修改也會(huì)同時(shí)影響原來的對(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ì)象中。
以上就是本文的全部內(nèi)容,如果您喜歡這篇文章,歡迎將它分享給朋友們。
感謝您的閱讀,祝您生活愉快!
作者:小美哥
2019-03-17
總結(jié)
以上是生活随笔為你收集整理的python浅拷贝_Python中的浅拷贝和深拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减肥能吃冰糕吗
- 下一篇: python echo函数_python