首页 > 代码库 > 完全理解python深拷贝和浅拷贝
完全理解python深拷贝和浅拷贝
import copy
a = [1, 2, 3, 4, [‘a‘, ‘b‘]] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append(‘c‘) #修改对象a中的[‘a‘, ‘b‘]数组对象
print ‘a = ‘, a
print ‘b = ‘, b
print ‘c = ‘, c
print ‘d = ‘, d
输出结果:
a = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5]
b = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5]
c = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘]]
d = [1, 2, 3, 4, [‘a‘, ‘b‘]]
再来了解一下怎么copy的。
import copy
a = [1, 2, 3, 4, [‘a‘, ‘b‘]] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
print id(a[0]),id(a[1]),id(a[2]),id(a[3]),id(a[4]),id(a[4][0]),id(a[4][1])
print id(c[0]),id(c[1]),id(c[2]),id(c[3]),id(c[4]),id(a[4][0]),id(a[4][1])
print id(d[0]),id(d[1]),id(d[2]),id(d[3]),id(d[4]),id(a[4][0]),id(a[4][1])
a.append(5) #修改对象a
a[4].append(‘c‘) #修改对象a中的[‘a‘, ‘b‘]数组对象
print id(a[0]),id(a[1]),id(a[2]),id(a[3]),id(a[4]),id(a[4][0]),id(a[4][1])
print id(c[0]),id(c[1]),id(c[2]),id(c[3]),id(c[4]),id(a[4][0]),id(a[4][1])
print id(d[0]),id(d[1]),id(d[2]),id(d[3]),id(d[4]),id(a[4][0]),id(a[4][1])
输出结果:
32303840 32303828 32303816 32303804 40936712 31936000 31936024
32303840 32303828 32303816 32303804 40936712 31936000 31936024
32303840 32303828 32303816 32303804 41296480 31936000 31936024
32303840 32303828 32303816 32303804 40936712 31936000 31936024
32303840 32303828 32303816 32303804 40936712 31936000 31936024
32303840 32303828 32303816 32303804 41296480 31936000 31936024
可以明显的看到,浅拷贝只是拷贝父对象的所有内容,而深拷贝则对子对象新建一个对象,再拷贝内容,所以,当子对象发生改变时,浅拷贝会发生改变,而深拷贝不会发生改变。