python中淺拷貝和深拷貝的區別


淺拷貝調用copy模塊下的copy()方法-----> b = copy.copy(a) #a為初始對象,b為淺拷貝對象

深拷貝調用copy模塊下的deepcopy()方法------> b = copy.deepcopy(a) #a為初始對象,b為深拷貝對象

import copy
list1 = [[1,2],'abc']
list2 = copy.copy(list1)
list3 = copy.deepcopy(list1)
print('原始對象:' + str(list1) + '  #  其中第一個元素[1,2]為可變元素')
print('原始對象地址:'+ str(id(list1)) + ' 可變元素對象地址:' + str(id(list1[0])))
print('淺拷貝對象:' + str(list2))
print('淺拷貝對象地址:'+ str(id(list2)) + ' 可變元素對象地址:' + str(id(list2[0])))
print('深拷貝對象:' + str(list3))
print('深拷貝對象地址:' + str(id(list3)) + ' 可變元素對象地址:' + str(id(list3[0])))
list1[0].append(3)
print('-------原始對象中的列表改變----------')
print('改變后原始對象:' + str(list1))
print('改變后原始對象地址:'+ str(id(list1)) + ' 可變元素對象地址:' + str(id(list1[0])))
print('改變后淺拷貝對象:' + str(list2))
print('改變后淺拷貝對象地址:'+ str(id(list2)) + ' 可變元素對象地址:' + str(id(list2[0])))
print('改變后深拷貝對象:' + str(list3))
print('改變后深拷貝對象地址:' + str(id(list3)) + ' 可變元素對象地址:' + str(id(list3[0])))
View Code

代碼運行結果如下:

可以看出淺拷貝和深拷貝后對象地址都會發生變化

不同的是如果原始對象中有可變元素(如上圖中的列表[1,2]),淺拷貝后可變元素地址一樣,而深拷貝后可變元素地址不一樣

所以當初始對象中的可變元素發生改變時(如在列表中增加元素),淺拷貝對象也會發生變化,而深拷貝對象不會

python的默認拷貝方式是淺拷貝,因為花費時間更短、使用內存更少、效率更高。


 詳細點可以看:https://blog.csdn.net/bufengzj/article/details/90486991 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM