1. 程式人生 > >python學習系列--深拷貝和淺拷貝

python學習系列--深拷貝和淺拷貝

深拷貝 淺拷貝 copy deepcopy

  1. 概念

    普通情下,復制一個對象是不會新開辟內存空間的,只是把新的對象名稱指向原有的內存地址,這種操作其實不是算是拷貝,只是新的引用。把新的對象置於新的內存空間中,才是拷貝。在python中,深淺拷貝的區別實際上是拷貝的深度不同。

  2. 操作

    常見的‘=’號就是一種拷貝方式。python在復制對象時實際上是調用copy模塊的copy方法,即copy.copy()。而使用deepcopy()函數操作就是深拷貝。對於字符串和數字來說,不管是深拷貝還是淺拷貝,都只是在原有內存地址上的新引用,所以是沒有區別的。可以用id()函數來驗證內存地址的異同。

  3. 字典的拷貝

    使用淺拷貝時,會生成一個新字典,而新舊字典的id值不同,但是字典中的鍵值的id是相同的。也就是說,淺拷貝字典時,只會復制字典的最外一層,而內層仍使用原來的內存位置。

    使用深拷貝時,同樣會生成一個新字典,字典的id值不同,字典中的鍵也會生成新的拷貝,但是字典中的鍵對應的值的id仍然是相同的。那區別在哪裏呢?實際上深淺拷貝的區別在於拷貝的層次不同,淺拷貝只拷貝第一層,而深拷貝會拷貝多層(所有層)。如果字典中還嵌套了列表或者字典,那麽這些嵌套的層也會被拷貝。

    那字典中的鍵的值為什麽是原來的呢?這是因為,雖然拷貝了字典,但是字典中的值仍然是對原始值(對象)的引用。這時如果改變新字典的值,那麽新的引用就產生了,字典的值也就被改變了(與原始值的id不相同)。

  4. 列表和元組的copy

    與字典的copy相同,深淺拷貝的區別在於拷貝的層次不同。

python學習系列--深拷貝和淺拷貝