1. 程式人生 > >python中的“深拷貝”和“淺拷貝” copy

python中的“深拷貝”和“淺拷貝” copy

直接給例子

以下所有操作都是基於 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}]