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']