当前位置:   article > 正文

第九课:浅拷贝与深拷贝_marshal.copy是浅拷贝吗

marshal.copy是浅拷贝吗

一、可变参数和不可变参数

Python中string、tuple和number是不可变对象,而dict、list等是可变对象。

不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新的值;

可变对象的可变性实质上是指更改可变对象中的子对象,比如ist中的item元素的更改。

直接赋值:其实就是对象的引用(别名),只是形成2个变量,实际上还是指向同一个对象。

eg:

  1. #直接赋值
  2. a = [1,2,3]
  3. b = a
  4. print(id(a)) #通过id查看变量在内存中的地址
  5. print(id(b))
  6. a[0] = 5 #修改的是a
  7. print(a)
  8. print(b)

二、浅拷贝

python拷贝一般都是浅拷贝,拷贝时,只拷贝父对象,不会拷贝对象的内部的子对象,因此,源对象与拷贝对象会引用同一个子对象。

eg:

  1. # 浅拷贝
  2. a = [1,2,3]
  3. b = [11,22,33]
  4. c = [111,222,333]
  5. list01 = [a,b,c]
  6. print(id(list01))
  7. list02 = list01[:]
  8. #查看list01 和 list02
  9. print(list01)
  10. print(list02)
  11. print('_'*20)
  12. #检查list01 和 list02 在内存中的地址
  13. print(id(list01))
  14. print(id(list02))
  15. #修改一下
  16. a[0] = 5
  17. # print(a)
  18. print(list01)
  19. print(list02)

三、深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同。

eg:

  1. #深拷贝
  2. import copy
  3. a = [1,2,3]
  4. b = [11,22,33]
  5. c = [111,222,333]
  6. list01 = [a,b,c]
  7. print(id(list01))
  8. #赋值
  9. list02 = copy.deepcopy(list01)
  10. #查看list01 和 list02
  11. print(list01)
  12. print(list02)
  13. print('_'*20)
  14. #检查list01 和 list02 在内存中的地址
  15. print(id(list01)) #
  16. print(id(list02)) #
  17. #修改一下
  18. a[0] = 5
  19. # print(a)
  20. print(list01)
  21. print(list02)

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/616598
推荐阅读
相关标签
  

闽ICP备14008679号