打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
两分钟掌握在python的深拷贝与浅拷贝

Python中的深拷贝和浅拷贝是两种不同的对象复制方式,它们的区别在于是否复制对象内部的子对象。深拷贝会完全复制一个对象及其所有的子对象,创建一个新的独立的对象;浅拷贝只会复制一个对象的引用,不会复制其子对象,如果原对象改变,浅拷贝的对象也会受到影响。为了更好地理解深拷贝和浅拷贝,可以看一些代码示例:

# 导入copy模块,它提供了深拷贝和浅拷贝的函数import copy# 定义一个列表a,它包含一个嵌套的列表[3, 4]a = [1, 2, [3, 4]]# 使用赋值操作符=来复制a,得到bb = a# 使用copy.copy函数来浅拷贝a,得到cc = copy.copy(a)# 使用copy.deepcopy函数来深拷贝a,得到dd = copy.deepcopy(a)# 打印a, b, c, d的值和idprint(a, id(a)) # [1, 2, [3, 4]] 140424457381568print(b, id(b)) # [1, 2, [3, 4]] 140424457381568print(c, id(c)) # [1, 2, [3, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824# 修改a中的第一个元素为0a[0] = 0# 打印a, b, c, d的值和idprint(a, id(a)) # [0, 2, [3, 4]] 140424457381568print(b, id(b)) # [0, 2, [3, 4]] 140424457381568print(c, id(c)) # [1, 2, [3, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824# 修改a中的嵌套列表中的第一个元素为5a[-1][0] = 5# 打印a, b, c, d的值和idprint(a, id(a)) # [0, 2, [5, 4]] 140424457381568print(b, id(b)) # [0, 2, [5, 4]] 140424457381568print(c, id(c)) # [1, 2, [5, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824

从上面的代码中,可以看到以下几点:

  • 赋值操作符=只是将一个变量指向另一个变量所指向的对象,并不会创建新的对象。所以a和b指向同一个列表对象,它们的id相同,如果修改其中一个变量,另一个变量也会跟着改变。
  • 浅拷贝copy.copy函数会创建一个新的对象,并将原对象中的元素复制过来。但是如果元素是可变对象,如列表、字典等,那么浅拷贝只会复制它们的引用,而不会复制它们本身。所以c是一个新的列表对象,它和a的id不同,但是c中的嵌套列表和a中的嵌套列表是同一个对象,它们的id相同。如果修改c中不可变元素(如整数),那么不会影响a;但是如果修改c中可变元素(如嵌套列表),那么也会影响a。
  • 深拷贝copy.deepcopy函数会创建一个新的对象,并将原对象中的所有元素(包括可变对象)都复制过来。所以d是一个新的列表对象,它和a的id不同,而且d中的嵌套列表也是一个新的列表对象,它和a中的嵌套列表的id不同。如果修改d中的任何元素,都不会影响a。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python FAQ2:赋值、浅拷贝、深拷贝的区别? // 神奕的博客
面试题-python 浅拷贝和深拷贝(copy模块)
python中的深拷贝和浅拷贝理解
Python中深拷贝与浅拷贝的区别?
Python|赋值、浅拷贝与深拷贝
【Python之路】第四篇
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服