python中的“深拷貝”和“淺拷貝” copy
阿新 • • 發佈:2018-12-23
直接給例子
以下所有操作都是基於 a 這個list 來講解的
>>> import copy
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
直接“=”
這樣傳的**“引用”**,兩者指向記憶體中同樣的地址單元,修改一個,另一個會跟著做相同修改
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b=a
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> a[0]=-1 #對a進行修改 b也會跟著變的
>>> a
[-1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b
[-1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>>
copy.copy() 淺拷貝
只拷貝父物件,不會拷貝物件的內部的子物件。,理解看下面的例子,很好的理解的
例子1 修改父物件中的值
>>>
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b=copy.copy(a)
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> a[0]="修改第一個位置上的值" #位置0的是個數 不子物件 b不會改變 因為是“淺拷貝”
>>> a
['修改第一個位置上的值', 2, 3, 4, [5, 6, 7] , (11, 23), {1: 2, 3: 4}]
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
例子2 修改子物件中的值
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b=copy.copy(a)
>>> b
>>> a[4][0]="修改內部物件list的值" #這裡修改的是 內部子物件list的值 ,由於是“淺拷貝”,所以b 也會變
>>> a
['1', 2, 3, 4, ['修改內部物件list的值', 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b
[1, 2, 3, 4, ['修改內部物件list的值', 6, 7], (11, 23), {1: 2, 3: 4}]
例子3 替換整個子物件list
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b=copy.copy(a)
>>> b
>>> a[4]="替換整個物件"
>>> a
['1', 2, 3, 4, '替換整個物件', (11, 23), {1: 2, 3: 4}]
>>> b
[1, 2, 3, 4, ['5', 6, 7], (11, 23), {1: 2, 3: 4}]
例子4 修改子物件 字典
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b=copy.copy(a)
>>> b
>>> a[-1][1]="修改內部詞典的值"
>>> a
[1, 2, 3, 4, ['5', 6, 7], (11, 23), {1: '修改內部詞典的值', 3: 4}]
>>> b
[1, 2, 3, 4, ['5', 6, 7], (11, 23), {1: '修改內部詞典的值', 3: 4}]
copy.deepcopy() 深拷貝
** 拷貝物件及其子物件**,一旦使用“深拷貝”,兩者是相互獨立,沒有任何聯絡,任何操作就只是針對
>>> a=[1,2,3,4,[5,6,7],(11,23),{1:2,3:4}]
>>> b=copy.deepcopy(a)
>>> a
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> a[4][0]=10000
>>> a
[1, 2, 3, 4, [10000, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]
>>> a[-1][1]=1000000
>>> a
[1, 2, 3, 4, [10000, 6, 7], (11, 23), {1: 1000000, 3: 4}]
>>> b
[1, 2, 3, 4, [5, 6, 7], (11, 23), {1: 2, 3: 4}]