python中的淺拷貝和深拷貝

      python中的淺拷貝深拷貝實際上是對內存的使用. python

      所謂淺拷貝就是對引用的拷貝(只拷貝父對象)  app

      所謂深拷貝就是對對象的資源的拷貝 code

      下面來看如下兩個圖和實例來更好理解. 對象


以上圖文字錯誤,應該是深拷貝 內存

淺拷貝:能夠理解爲只拷貝對象數據,裏面的數據空間是不獨立出來,其中的數據仍是共用同一個地址空間: 資源

>>> import copy
>>> a = [1,2,3,['a','b','c']]
>>> b = a
>>> c = copy.copy(a)
>>> a
[1, 2, 3, ['a', 'b', 'c']]
>>> b
[1, 2, 3, ['a', 'b', 'c']]
>>> c
[1, 2, 3, ['a', 'b', 'c']]
>>> id(a)
139735396405472
>>> id(b)
139735396405472
>>> id(c)
139735396408856
>>> a.append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> b
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> c                        c只對a的父對象進行拷貝(子對象是裏面的資源),裏面的資源其實並無獨立的拷貝出來
[1, 2, 3, ['a', 'b', 'c']]        
>>> id (a[0])                               
17499304
>>> id (c[0])
17499304
>>> id (a[3])                子對象仍是共用同一個地址空間
139735396360272
>>> id (c[3])
139735396360272
>>> a[3].append('d')         對a的內層數據修改時,c也會跟着變化
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> b
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> c
[1, 2, 3, ['a', 'b', 'c', 'd']]

深拷貝:能夠理解成爲把全部的數據全都拷貝出來,有獨立的存儲空間 class

>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> d = copy.deepcopy(a)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> id(a)                                
139735396405472
>>> id(d)
139735396405760
>>> id(a[0])       這裏由於1,2,3數字是不可變的,因此即使是地址空間同樣,它也只引用同一個數據而已.
17499304
>>> id(d[0])
17499304
>>> id(a[3])       這裏列表就是佔用不一樣的地址空間.與淺拷貝相反.
139735396360272
>>> id(a[4])
139735396579248
>>> a.append('e')  淺拷貝影響不了,這裏深拷貝更影響不了這裏.
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> a[3].append('x') 深拷貝有本身的存儲空間,有本身的獨立的數據.
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd', 'x'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
相關文章
相關標籤/搜索