码迷,mamicode.com
首页 > 编程语言 > 详细

Python_浅拷贝与深拷贝

时间:2020-03-09 22:43:21      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:不可变对象   选择   表示   color   总结   例子   imp   改变   因此   

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

标签:不可变对象   选择   表示   color   总结   例子   imp   改变   因此   

原文地址:https://www.cnblogs.com/shz-blog/p/12451730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!