python的深拷貝和淺拷貝


1、淺拷貝

淺拷貝:相當於引用,不開辟新空間。b = a 只是把a的地址復制給了b。

如,賦值。

In [2]: a = [11, 22, 33]
In [3]: b = a
In [4]: b
Out[4]: [11, 22, 33]
In [5]: id(a)
Out[5]: 140117500009736
In [6]: id(b)
Out[6]: 140117500009736
=拷貝地址相同

 

2、深拷貝

深拷貝:開辟新的內存空間。

深拷貝又有2種:copy()和deepcopy(),都是深拷貝,深度不同。
(1)copy()拷貝是開辟新空間(新地址),但空間里的元素不是新空間(新地址),而是引用(舊地址),引用的好處是占用內存少。簡言之,copy()拷貝是對於一個對象的頂層拷貝。
(2)deepcopy()拷貝也是開辟新空間(新地址),並且所有的元素都為全新的空間(新地址),整個全新空間的壞處就是占用內存多。簡言之,deepcopy()把a的內容完整的復制了一份。

針對可變變量,深拷貝才有不同效果,如字典、列表。

針對不可變變量,深拷貝和淺拷貝效果是一樣的,如int、long、float、tuple元組等。

copy拷貝
In [2]: a = [11, 22, 33]
In [3]: import copy
In [4]: b = copy.copy(a)
In [5]: b
Out[5]: [11, 22, 33]
In [6]: id(a)
Out[6]: 140254995326344
In [7]: id(b)
Out[7]: 140255016303176
copy拷貝開辟淺層空間,但copy用於拷貝元組的時候不會開辟淺層空間,而全都是引用。
In [8]: id(a[0])
Out[8]: 10914688
In [9]: id(b[0])
Out[9]: 10914688
copy拷貝中,元素的地址相同
In [10]: a.append(44)
In [11]: a
Out[11]: [11, 22, 33, 44]
In [12]: b
Out[12]: [11, 22, 33]
添加元素沒有相互影響,但修改元素就會相互影響了

deepcopy拷貝
In [2]: a = [11, 22, 33]
In [3]: import copy
In [4]: b = copy.deepcopy(a)
In [5]: b
Out[5]: [11, 22, 33]
In [6]: id(a)
Out[6]: 139826159553800
In [7]: id(b)
Out[7]: 139826159601160
deepcopy開辟整個的全新空間。
添加和修改元素都沒有影響。

 

小結:

=賦值操作:
可變變量的引用會改變
+=修改操作:
可變變量的引用不會改變,但是值會改變。

1、等號賦值,就是將引用給另一個變量,不開辟新的空間。屬於淺拷貝。對可變、不可變變量都適用,僅有可變變量有差別效果。
2、深拷貝copy(),就是將表層變量值,復制一份,開辟新的內存空間。屬於深拷貝。對可變、不可變變量都適用,僅有可變變量有差別效果。
3、深拷貝deepcopy(),就是整體變量值,賦值一份,開辟新的內存空間。屬於深拷貝。對可變、不可變變量都適用,僅有可變變量有差別效果。


免責聲明!

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



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