Python_浅拷贝与深拷贝
Posted shz-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)内部不可变对象:浅拷贝和深拷贝都没有改变地址
注:地址的改变,表示对原对象进行的修改不会对新对象产生影响。因此,在实际应用中,需根据实际需求选择是浅拷贝还是深拷贝。
以上是关于Python_浅拷贝与深拷贝的主要内容,如果未能解决你的问题,请参考以下文章