淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現(一)
淺拷貝與深拷貝的實現方式、區別;deepcopy如果你來設計,如何實現;
copy淺拷貝:沒有拷貝子對象,所以原始數據改變,子對象改變
deepcopy深拷貝:包含對象裏面的子對象的拷貝,所以原始對象的改變不會造成深拷貝裏的任何子元素的改變
Python裏的賦值符號“=”只是將對象進行了引用,如果想新開辟進行了引用,如果想新開辟地址new出一個新對象,要用copy模塊裏copy.copy(),但是用這個方法得到的對象就是新對象,但是數據還是引用。
如果要完全得到一個一模一樣的對象,要用copy.deepcopy()方法。這樣,在改變更新對象的時候,原對象才能不受影響,也就是保持原始數據不變。
如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值——相當於通過“傳引用”來傳遞對象。如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能直接修改原始對象——相當於通過“傳值”來傳遞對象。
Python通過引用計數機制實現自動垃圾回收功能,Python中的每個對象都有一個引用計數,用來計數該對象在不同場所分別被引用了多少次。每當引用一次Python對象,相應的引用計數就增1,每當消毀一次Python對象,則相應的引用就減1,只有當引用計數為零時,才真正從內存中刪除Python對象。
Python提供了3種復制方法,最常見的=、copy.copy()
以上運行結果:
打印出了各個對象的ID值,如果id一樣,毫無疑問就是同一個對象。當調用默認復制函數時,形參的id和實參的id是相同的,也就是說的同一個對象,而調用copy模塊拷貝時形參id和實參id不同,也就是說是不同的對象。註意觀察列表中的最後一個dict元素。默認的=復制和copy復制得到的id是相同的,也就是說他們是同一個對象,而deepcopy的id和其他都不一樣,也就是說是新對象。
歡迎關註小婷兒的博客:
csdn:https://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如果你來設計,如何實現(一)