Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝
import copy
a = 1 # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同a = [1,2] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
单层深拷贝
import copy
a = 1 # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址相同a = [1,2] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
结论一:
不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址
不管深拷贝还是浅拷贝对可变数据类型都是会重新创建新的内存空间
浅拷贝嵌套
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
深拷贝嵌套
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址相同#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
print(id(a[1]),id(copy_a[1])) # 内存地址不相同# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
结论二:
浅拷贝:
- 外层是不可变类型、不管内层是否可变都是引用拷贝
- 外层是可变类型,不管内层是否可变都会从新创建新的内存空间
深拷贝:
- 外层是不可变类型,会递归判断内层数据类型、如果可变则创建新的内存地址、都为不可变就是引用拷贝
- 外层是可变数据类型、不管内层是否可变都会创新新的内存地址、但是内部如果为可变则递归创建、不可变则为引用地址
总结:
浅拷贝:
- 浅拷贝只做最顶层的数据类型判断
- 如果顶层是可变类型则创建新的内存空间
- 如果顶层是不可变数据类型就是引用拷贝
深拷贝:
- 深拷贝做递归拷贝,可以递归拷贝所有的内部嵌套数据(可以理解为循环遍历做浅拷贝判断)
- 深拷贝递归拷贝遇到可变类型则创建新的内存空间
- 深拷贝递归拷贝遇到不可变数据类型就是拷贝的引用
转载于:https://www.cnblogs.com/fandx/p/10462913.html
Python中浅拷贝和深拷贝的区别总结与理解相关推荐
- python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别
Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...
- 彻底理解Python中浅拷贝和深拷贝的区别
目录 前言 1. 浅拷贝和深拷贝的概念 2. is和==的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 ...
- Python中浅拷贝和深拷贝的理解与研究
Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...
- Python中浅拷贝和深拷贝的理解与研究 1
Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...
- python中浅拷贝与深拷贝
参考链接 1. 引用 https://blog.csdn.net/qq_38556217/article/details/103002827 2. Python中变量在内存的存储与地址变化详解(深浅拷 ...
- python赋值浅拷贝和深拷贝的区别_python赋值、浅拷贝、深拷贝区别
在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<Py ...
- Python中浅拷贝与深拷贝的骚操作
作者:缪斯mius@阿里云Python训练营 博客地址:https://blog.csdn.net/m0_37759382/article/details/108489108 [例子]浅拷贝与深拷贝中 ...
- Java中浅拷贝和深拷贝的区别
深拷贝和浅拷贝的区别 浅拷贝:被拷贝的对象的所有属性值都与原来的对象相同,而对象的所有属性引用仍然指向原来的属性所指向的内存地址.需要注意的是cloneObj == obj 返回的是false,所以使 ...
- 对python中浅拷贝和深拷贝分析详细介绍
首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变. 不可变:Number(数字).String(字符串).Tuple(元组). 可以变:List(列表).Dictiona ...
最新文章
- Matplotlib可视化散点图、配置X轴为对数坐标、并使用线条(line)连接散点图中的数据点(Simple Line Plot with Data points in Matplotlib)
- css hack *html,CSS Hack详解
- MyEclipse导入项目后 js文件报错
- C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
- 问题 K: n个数的最大值和最小值
- 系列课程 ElasticSearch 之第 8 篇 —— SpringBoot 整合 ElasticSearch 做查询(分页查询)
- 无线渗透-----aircrack-ng破解WEP加密
- html打印自定义页头,CSS实现打印网页自定义页眉页脚
- 什么是安迪比尔定理?
- Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外
- 当今十大备份应用软件
- chrome和Firefox浏览器如何访问非安全端口站点
- c语言在线练习题库,C语言练习题库(含答案).doc
- Linux虚拟机忘记密码
- 基准价搭档“货比三家” 8thManage轻松节省采购成本
- 家家有个机器人 机器人正经历“PC式发展”
- SX1308无法升压带载发烫解决办法
- spark触发adaptive skewed join的例子code
- linux-shell系列5-统计
- windows7下安装centos7系统或者单独装centos7