深拷贝、浅拷贝
1. 浅拷贝
浅拷贝是对于一个对象的顶层拷贝
import copy a = [[1, 2], 3] b = copy.copy(a) print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) print(id(a[1])) print(id(b[1])) a[0].append(1) print(a) print(b)
输出结果:
2249583452872 2250135748552 2249583452808 2249583452808 140714232963984 140714232963984 [[1, 2, 1], 3] [[1, 2, 1], 3]
copy()是浅拷贝,只拷贝了最顶层的数组,而数组中的内容只是拷贝了引用。
因此用a[0].append(1)方法后,数组a和b都发生了改变。
2. 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
import copy a = [[1, 2], 3] b = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) a[0].append(1) print(a) print(b)
输出结果:
1931836547784 1932360400776 1931836547720 1931837818120 [[1, 2, 1], 3] [[1, 2], 3]
deepcopy()是深拷贝,不仅拷贝最顶层的数组,数组里的内容也拷贝了,这里不同于拷贝引用,而是创建了新的地址空间,存放的内容和原数组相同。因此这次用a[0].append(1)后,b数组没有发生变化。
3.拷贝的其他方式
分片拷贝浅拷贝
import copy a = [[1, 2], 3] b = a[:] print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) print(id(a[1])) print(id(b[1])) a[0].append(1) print(a) print(b)
输出结果:
2672287769288
2672811617864
2672287769224
2672287769224
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]
可见:分片拷贝是浅拷贝。
字典的copy()方法
d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying'])
c = d.copy()
print(d)
print(c)
print(id(d))
print(id(c))
print(id(d['name']))
print(id(c['name']))
print(id(d['friend']))
print(id(c['friend']))
d['friend'].append('lisa')
print(d)
print(c)
结果:
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
2175018372336
2175021103360
2175021498672
2175021498672
2175017902728
2175017902728
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
可见,字典的copy()方法也是浅拷贝。
4.注意
copy()和deepcopy()对于不包含可变类型数据的元组,只会拷贝引用
import copy d = (1, 2, 3) c = copy.copy(d) b = copy.deepcopy(d) print(id(d)) print(id(c)) print(id(b))
结果:
1959295969464 1959295969464 1959295969464
当deepcopy()对于包含可变类型数据的元组时,才会拷贝整个元组的内容
import copy
d = (1, 2, [1,2,3])
c = copy.copy(d)
b = copy.deepcopy(d)
print(id(d))
print(id(c))
print(id(b))
结果:
2774011472056
2774011472056
2774011384024