很多人第一次聽到“淺拷貝”和“深拷貝”的時候,都會覺得這倆詞挺像的,好像也差不多。但真要在代碼里用的時候,往往會遇到一些意想不到的坑。其實這兩個概念的區別,本質上就是拷貝的時候,到底是復制對象本身,還是順帶把里面嵌套的東西也復制一份。
淺拷貝就好比你復印了一份文件,但里面夾的附件只是寫了“參考某某資料”,你復印的時候也只是把這句話帶過去,附件本身沒動。也就是說,淺拷貝只會拷貝對象的第一層內容,如果對象里面還有嵌套的可變對象,比如列表、字典,它們還是指向原來的地址。
在 Python 里常見的淺拷貝方式有幾種,比如用 copy.copy(),或者有些內置方法(像切片)也會默認給你淺拷貝。
你看,最外層的列表確實是新建了一份,但里面的 [2, 3] 還是公用的,所以改了 b 里面的值,a 也跟著變了。
深拷貝就更徹底一些,相當于你不但復印了文件,還把所有的附件、參考資料也都一份份拷貝出來。這樣一來,新對象和原對象完全獨立,互不影響。
Python 提供了 copy.deepcopy() 來實現深拷貝:
這里就能看到,改了 b 之后,a 完全沒受影響,因為內外層都被復制了一份。
什么時候用淺拷貝,什么時候用深拷貝如果對象里面沒有嵌套太復雜的結構,或者你本來就希望它們共享一部分數據,那淺拷貝就夠用了,速度還快。比如復制一個只有數字的列表,淺拷貝和深拷貝結果其實沒差別。 但如果你的數據結構里層層嵌套,或者你特別想保證拷貝之后彼此獨立,互不干擾,那就老老實實用深拷貝。
順帶提一句,深拷貝雖然方便,但它會遞歸地去復制每一層對象,在一些結構特別龐大的場景下,性能和內存占用都會比較高,得小心。
以上就是“淺拷貝(Shallow Copy) 和深拷貝(Deep Copy) 的區別是什么?”的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/13518/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料