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

猜你喜欢

转载自blog.csdn.net/qq_32806793/article/details/84585013