深拷贝、浅拷贝
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