copy 与 deepcopy
# copy 与 deepcopy
# 可变对象
主要是 list 和 dict
直接上例子
import copy
a = {'key':[1,2,3]}
b = copy.copy(a)
c = copy.deepcopy(a)
print(a,b,c)
print(id(a),id(b),id(c))
print(a['key'],b['key'],c['key'])
print(id(a['key']),id(b['key']),id(c['key']))
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
结果:
{'key': [1, 2, 3]} {'key': [1, 2, 3]} {'key': [1, 2, 3]}
2021806902080 2021806902336 2021806902464
[1, 2, 3] [1, 2, 3] [1, 2, 3]
2021810163264 2021810163264 2021810160768
1
2
3
4
2
3
4
由上面的结果可以看出:
- copy 可变对象时,子元素的地址没变,引用之前的子元素的地址
- deepcopy 子元素的地址也被拷贝
# 不可变对象
主要是针对元组、字符串、数字,只要创建就不能改的元素
# 对于纯不可变对象
上代码
a = ('a','b','c')
b = copy.copy(a)
c = copy.deepcopy(a)
if b == c:
print("b和c的值相等")
if id(b) == id(c):
print("b和c的地址相等")
1
2
3
4
5
6
7
2
3
4
5
6
7
结果:
b和c的值相等
b和c的地址相等
1
2
2
由上面的结果可以看出:
copy 和 deepcopy 的值一致,存储的地址空间也一致
# 当不可变元素中含有可变元素时,如元组含有可变元素
a = (1,2,[2,3,4])
b = copy.copy(a)
c = copy.deepcopy(a)
print(a,b,c)
print(id(a),id(b),id(c))
print(id(a[2]),id(b[2]),id(c[2]))
1
2
3
4
5
6
2
3
4
5
6
结果:
(1, 2, [2, 3, 4]) (1, 2, [2, 3, 4]) (1, 2, [2, 3, 4])
1541483727872 1541483727872 1541484299072
1541485940288 1541485940288 1541485937536
1
2
3
2
3
由上面的结果可以看出:
对于不可变对象中含有可变对象时,浅拷贝的父元素和子元素地址没改变,而深拷贝的会将父元素和子元素都复制一份,地址都会改变
(完)