当前位置: 首页 > news >正文

Python 深拷贝和浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样
(1)、深拷贝:拷贝了一份与原对象不同地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。
(2)、浅拷贝:对原对象值的拷贝,地址仍然指向原对象的地址,原对象的值发生变化,拷贝对象的值也会随着改变。
(3)、深拷贝和浅拷贝需要注意的地方是:可变元素的拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的指向同一个地址。

list1 = [[1, 2], 'feng', 66]
list2 = copy.copy(list1)
# 对象地址不同
print(id(list1))  # 14055210224
print(id(list2))  # 14055208953
# 里面的可变元素地址相同
print(id(list1[0]))  # 14055249424
print(id(list2[0]))  # 14055249424

下面解释可变类型和不可变类型的嵌套使用:

  • 可变类型:
  • 浅拷贝和深拷贝只要最外层是可变类型都会生成新的对象
    • [] 或者{}, 浅拷贝和深拷贝都会生成新的对象
    • [[],[]]列表的嵌套,可变类型嵌套了可变类型,浅拷贝, 只拷贝最外层,会生成新的对象, 内层是引用。深拷贝 外层和内层都会进行拷贝,都是全新的对象, 都有独立的存储空间
  • 不可变类型:
    • 最外层是不可变类型, 浅拷贝就一定是引用
    • ([],[]), copy浅拷贝, 只会拷贝最外层,内层只是引用, 但是最外层是不可变,拷贝之后毫无意义,仅仅是引用关系, deepcopy,从外层到内层都会拷贝,内层是可变,为了达到和原来的数据完全隔离, 会生成全新的对象
    • ((),()) 完全不可变, 拷贝了之后如果生成新的数据也无法修改, 所以不管深拷贝还是浅拷贝都是引用
    • ((),[]) 外层不可变,但是内层有一个是可变, copy依然是引用, deepcopy,会生成新的对象,内层的不可变类型是引用, 可变类型会生成新的对象

相关文章:

  • 05_Nacos-config配置中心介绍
  • 2022年9月深圳NPDP产品经理认证,【进入了解】
  • 字节架构师分析Spring Boot源码:日志、缓存、Web服务等
  • 自定义vue项目的雷达图组件
  • CREO:CREO软件之工程图【表】之一明细表、表格创建、创建BOM球标、自动生成零件报表的简介及其使用方法(图文教程)之详细攻略
  • 接口测试实战 | Android 高版本无法抓取 HTTPS,怎么办?
  • 嵌入式开发:清理可重用软件的API
  • Windows与网络基础-3-虚拟机安装Kali Linux
  • 面试题-谈谈你对JVM的理解
  • 面试时Dubbo原理记不住?来看看《Dubbo原理浅析——从RPC本质看Dubbo》
  • 开源治理:安全的关键
  • 什么是快应用?与原生APP相比优势在哪里
  • 卷积神经网络结构有哪些,卷积神经网络结构特点
  • 阿里内部首发面试终极指南V3.0,相对一线大厂面试知识点+面试题
  • vue路由原理
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【剑指offer】让抽象问题具体化
  • C++11: atomic 头文件
  • java正则表式的使用
  • Map集合、散列表、红黑树介绍
  • MySQL的数据类型
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • VuePress 静态网站生成
  • web标准化(下)
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 后端_MYSQL
  • 微信小程序设置上一页数据
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #NOIP 2014#Day.2 T3 解方程
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1) caustics\
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (rabbitmq的高级特性)消息可靠性
  • (八)c52学习之旅-中断实验
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十一)图像的罗伯特梯度锐化
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)Travel Information Center
  • (一)基于IDEA的JAVA基础12
  • (转载)深入super,看Python如何解决钻石继承难题
  • ./和../以及/和~之间的区别
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net快速开发框架源码分享
  • .Net面试题4
  • .Net中间语言BeforeFieldInit
  • [\u4e00-\u9fa5] //匹配中文字符
  • [1] 平面(Plane)图形的生成算法
  • [20160902]rm -rf的惨案.txt