Python学习笔记之浅拷贝和深拷贝

导语 在Python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢

一般的复制

  1. #encoding:utf-8 
  2. #定义一个嵌套集合 
  3. lista=[1,2,3,[4,5,6,[7,8,9]]] 
  4.  
  5. listb=lista 
  6. #分别打印出 lista和listb的地址值 
  7. print id(lista) #4511103096 
  8. print id(listb) #4511103096 
  9.  
  10. #修改lista中的内容,listb中的内容也会跟着修改 
  11.  
  12. lista[0]=0 
  13. print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] 
  14. print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] 

  通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。

浅拷贝

  1. #encoding:utf-8 
  2. #定义一个嵌套集合 
  3. import copy 
  4. lista=[1,2,3,[4,5,6,[7,8,9]]] 
  5. #使用copy模块中copy方法 
  6. listb=copy.copy(lista) 
  7.  
  8. print id(lista) #4396231640 
  9.  
  10. print id(listb) #4396231712 
  11.  
  12. #发现lista和listb在内存中的地址有区别, 
  13. #打印元素中的第一个元素的地址值 
  14. print id(lista[0])#140666751466536 
  15.  
  16. print id(listb[0])#140666751466536 
  17.  
  18. #元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素, 
  19. # listb中的也要改变呢 
  20.  
  21. lista[0]=0 
  22.  
  23. print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] 
  24.  
  25. print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] 
  26.  
  27. #结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗 
  28. #我们在打印下lista[0]和listb[0]的地址 
  29. print id(lista[0])  #140666751466560 
  30.  
  31. print id(listb[0])  #140666751466536 
  32.  
  33. #会发现lista[0]重新指向内存中的其他地址 
  34.  
  35.  
  36. #这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list 
  37.  
  38. print id(lista[3])#4499779240 
  39.  
  40. print id(listb[3])#4499779240 
  41.  
  42. #修改lista[3]中第一个元素呢 
  43.  
  44. lista[3][0]=0 
  45.  
  46. print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] 
  47.  
  48. print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] 
  49.  
  50. #发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变 

  根据以上实践说明,浅拷贝对对象中对象没有拷贝。

  深拷贝

  1. #encoding:utf-8 
  2.     #定义一个嵌套集合 
  3.     import copy 
  4.     lista=[1,2,3,[4,5,6,[7,8,9]]] 
  5.  
  6.     #深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能 
  7.     listb=copy.deepcopy(lista) 
  8.  
  9.     lista[3][0]=0 
  10.  
  11.     print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]] 
  12.  
  13.     print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] 
  14.  
  15.     #深拷贝会解决修改lista[3][0]值不会影响listb中的值 
  16.  
  17.     #再来修改下第三层列表中元素是不是也完成拷贝 
  18.  
  19.     lista[3][3][0]=0 
  20.  
  21.     print lista  #[1, 2, 3, [0, 5, 6, [0, 8, 9]]] 
  22.  
  23.     print listb  #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] 
  24.  
  25.     #没有受到任何影响 

 

http://www.aseoe.com/ true Python学习笔记之浅拷贝和深拷贝 http://www.aseoe.com/show-18-1110-1.html report <?php echo strlen($content) / 2; ?> 在Python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢
TAG:Python 浅拷贝 深拷贝
本站欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明: 文章转载自:爱思资源网 http://www.aseoe.com/show-18-1110-1.html

[前端插件推荐] Plugin

1 2 3 4
  • jQuery实现逐字逐句显示插件l-by-l.min.js
  • jQuery带方向感知的鼠标滑过图片边框特效插件
  • jQuery HotKeys监听键盘按下事件keydown插件
  • 响应式无限轮播jQuery旋转木马插件
响应式无限轮播jQuery旋转木马插件
web前端开发
爱思资源网 Copyright 2012-2014 Www.Aseoe.Com All rights reserved.(晋ICP备13001436号-1)