Python_浅拷贝与深拷贝

1. 例子

(1)原对象(b1)可变

1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> b1 = [a1, a2]
5 >>> b2 = copy.copy(b1)    # 浅拷贝
6 >>> b3 = copy.deepcopy(b1)    # 深拷贝
  • 最外层对象的地址:浅拷贝和深拷贝都改变了
1 >>> id(b1)
2 1664414246280
3 >>> id(b2)
4 1664414248328
5 >>> id(b3)
6 1664414247944
1 >>> b1.append(5)
2 >>> b1
3 [[1, 2, 3], 4, 5]
4 >>> b2
5 [[1, 2, 3], 4]
6 >>> b3
7 [[1, 2, 3], 4]
  • 内部可变对象的地址:浅拷贝没有改变,深拷贝改变了
1 >>> id(b1[0])
2 1664416938696
3 >>> id(b2[0])
4 1664416938696
5 >>> id(b3[0])
6 1664414247624
1 >>> a1.append('a')
2 >>> b1
3 [[1, 2, 3, 'a'], 4, 5]
4 >>> b2
5 [[1, 2, 3, 'a'], 4]
6 >>> b3
7 [[1, 2, 3], 4]
  • 内部不可变对象的地址:浅拷贝和深拷贝都没有改变
1 >>> id(b1[1])
2 140735360230128
3 >>> id(b2[1])
4 140735360230128
5 >>> id(b3[1])
6 140735360230128

(2)原对象(c1)不可变

1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> c1 = (a1, a2)
5 >>> c2 = copy.copy(c1)
6 >>> c3 = copy.deepcopy(c1)
  • 最外层对象的地址:浅拷贝没有改变,深拷贝改变了
1 >>> id(c1)
2 1664417250952
3 >>> id(c2)
4 1664417250952
5 >>> id(c3)
6 1664416938248
  • 内部可变对象的地址:浅拷贝没有改变,深拷贝改变了
1 >>> id(c1[0])
2 1664416938696
3 >>> id(c2[0])
4 1664416938696
5 >>> id(c3[0])
6 1664417297160
1 >>> a1.append('a')
2 >>> c1
3 ([1, 2, 3, 'a'], 4)
4 >>> c2
5 ([1, 2, 3, 'a'], 4)
6 >>> c3
7 ([1, 2, 3], 4)
  • 内部不可变对象的地址:浅拷贝和深拷贝都没有改变
1 >>> id(c1[1])
2 140735360230128
3 >>> id(c2[1])
4 140735360230128
5 >>> id(c3[1])
6 140735360230128

 

2. 总结

(1)最外层对象:浅拷贝在对象可变时改变了地址,不可变时没有改变地址;而深拷贝都会改变地址

(2)内部可变对象:浅拷贝都没有改变地址;深拷贝都会改变地址

(3)内部不可变对象:浅拷贝和深拷贝都没有改变地址

 

注:地址的改变,表示对原对象进行的修改不会对新对象产生影响。因此,在实际应用中,需根据需求选择是浅拷贝还是深拷贝。

posted @ 2020-03-09 22:05  亦示  阅读(214)  评论(0编辑  收藏  举报