1. 程式人生 > >淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現(一)

淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現(一)

.net cal ict idt 變更 tmp png nbsp ocp

淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現;

copy淺拷貝:沒有拷貝子對象,所以原始數據改變,子對象改變

deepcopy深拷貝:包含對象裏面的子對象的拷貝,所以原始對象的改變不會造成深拷貝裏的任何子元素的改變

Python裏的賦值符號“=”只是將對象進行了引用,如果想新開辟進行了引用,如果想新開辟地址new出一個新對象,要用copy模塊裏copy.copy(),但是用這個方法得到的對象就是新對象,但是數據還是引用。

如果要完全得到一個一模一樣的對象,要用copy.deepcopy()方法。這樣,在改變更新對象的時候,原對象才能不受影響,也就是保持原始數據不變。

技術分享圖片

如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值——相當於通過“傳引用”來傳遞對象。如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能直接修改原始對象——相當於通過“傳值”來傳遞對象。

Python通過引用計數機制實現自動垃圾回收功能,Python中的每個對象都有一個引用計數,用來計數該對象在不同場所分別被引用了多少次。每當引用一次Python對象,相應的引用計數就增1,每當消毀一次Python對象,則相應的引用就減1,只有當引用計數為零時,才真正從內存中刪除Python對象。

Python提供了3種復制方法,最常見的=copy.copy()

copy.deepcopy()。下面通過一段代碼來看這三種復制方法的異同。

技術分享圖片

以上運行結果:

技術分享圖片

打印出了各個對象的ID值,如果id一樣,毫無疑問就是同一個對象。當調用默認復制函數時,形參的id和實參的id是相同的,也就是說的同一個對象,而調用copy模塊拷貝時形參id和實參id不同,也就是說是不同的對象。註意觀察列表中的最後一個dict元素。默認的=復制和copy復制得到的id是相同的,也就是說他們是同一個對象,而deepcopyid和其他都不一樣,也就是說是新對象。

歡迎關註小婷兒的博客:

csdnhttps://blog.csdn.net/u010986753

博客園:http://www.cnblogs.com/xxtalhr/

有問題請在博客下留言或加QQ群:483766429 或聯系作者本人 QQ 87605025

OCP培訓說明連接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培訓說明連接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

小婷兒的python正在成長中,其中還有很多不足之處,隨著學習和工作的深入,會對以往的博客內容逐步改進和完善噠。

小婷兒的python正在成長中,其中還有很多不足之處,隨著學習和工作的深入,會對以往的博客內容逐步改進和完善噠。

小婷兒的python正在成長中,其中還有很多不足之處,隨著學習和工作的深入,會對以往的博客內容逐步改進和完善噠。

重要的事說三遍。。。。。。

技術分享圖片技術分享圖片

淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現(一)