python之拷贝(深浅)
深浅拷贝
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。
数字和字符串
对于数字
和字符串
而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。
![](/assets/blank.gif)
# 导入copy模块 >>> import copy # 定义一个变量var1 >>> var1 = 123 # 输出var1的内存地址 >>> id(var1) 1347747440 >>> var2 = var1 # var2的内存地址和var1相同 >>> id(var2) 1347747440 # 浅拷贝 >>> var3 = copy.copy(var1) # var3的内存地址和var1相同 >>> id(var3) 1347747440 # 深拷贝 >>> var4 = copy.deepcopy(var1) # var4的内存地址和var1相同 >>> id(var4)
1347747440
![](/assets/blank.gif)
其他数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
- 创建一个字典
var1
var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
![](/assets/blank.gif)
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} >>> var2 = var1 >>> id(var1) 1937003361288 >>> id(var2) 1937003361288
![](/assets/blank.gif)
如图所示:
浅拷贝
浅拷贝,在内存中只额外创建第一层数据
![](/assets/blank.gif)
# 导入拷贝模块 >>> import copy >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} # 使用浅拷贝的方式 >>> var2 = copy.copy(var1) # 两个变量的内存地址是不一样的 >>> id(var1) 2084726354952 >>> id(var2) 2084730248008 # 但是他们的元素内存地址是一样的 >>> id(var1["k1"]) 2084726207464 >>> id(var2["k1"]) 2084726207464
![](/assets/blank.gif)
如图所示:
深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
![](/assets/blank.gif)
# 导入拷贝模块 >>> import copy >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} # 使用深拷贝的方式把var1的内容拷贝给var2 >>> var2 = copy.deepcopy(var1) # var1和var2的内存地址是不相同的 >>> id(var1) 1706383946760 >>> id(var2) 1706389852744 # var1和var2的元素"k3"内存地址是不相同的 >>> id(var1["k3"]) 1706389853576 >>> id(var2["k3"]) 1706389740744 # var1和var2的"k3"元素的内存地址是相同的 >>> id(var1["k3"][1]) 1706383265744 >>> id(var2["k3"][1]) 1706383265744
![](/assets/blank.gif)
如图所示:
![](/assets/blank.gif)
import copy# 对数字 字符串 # a = 1 # b = a # # print(id(a) == id(b)) # b = 12 # print(a, b) # print(id(a) == id(b))# a = 'aa' # b = copy.copy(a) # print(a, b) # print(id(a) == id(b)) # # b = 'bb' # print(a, b) # print(id(a) == id(b))# c = copy.deepcopy(a) # print(a, c) # print(id(a) == id(c)) # # c = 'cc' # print(a, c) # print(id(a) == id(c))\# a = [1, 2, 3, 4, 5] # # b = a # # b[1] = 5 # print(a, b) # print(id(a) == id(b))# # a = [1, 2, 3, 4, 5, [1, 2]] # b = copy.copy(a) # print(a, b) # print(id(a) == id(b)) # print(id(a[1]) == id(b[1])) # print(id(a[5]) == id(b[5])) # b[1] = 10 # print(a[1]) # print(id(a[1]) == id(b[1]) ) # # print('----------') # print(id(a[5][0]) == id(b[5][0])) # b[5][0] = 50 # print(a[5][0]) # print(id(a[5][0]) == id(b[5][0]))a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}] b = copy.deepcopy(a) print(id(a) == id(b)) print(id(a[3]) == id(b[3])) print(id(a[5]) == id(b[5])) # b[3] = 20 # print(a, b ) print(id(a[5][1][0][1]) == id(b[5][1][0][1])) b[5][1][0] = 20 print(a[5][1][0])
优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg
转载于:https://www.cnblogs.com/Xanderzyl/p/10496392.html
python之拷贝(深浅)相关推荐
- Python赋值与深浅拷贝
# coding=utf-8 #Python 赋值 与深浅拷贝 #Python 赋值时会创建一个新的引用,对不可变对象,实际上象创建一个副本,但对可变对象,因为是引用,当对其中一个对象的元素进行操作时 ...
- python字典拷贝_python字典复制
python学习系列--深拷贝和浅拷贝 概念 普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用.把新的对象置于新的内存空间中 ...
- Python 列表拷贝
前言 Python 列表拷贝很容易搞错,这里做一下简单的总结.通常我们只是想根据现有的列表来创建一个全新的列表,而一说到列表拷贝,可能会下意识的想到直接用"=",那么我们通过示例来 ...
- python——赋值与深浅拷贝
结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来 ...
- python赋值、深浅拷贝
赋值: 赋值是绑定对象的引用:只要对象被修改,就会发生变化 深浅拷贝 如果希望将列表复制一份,通过列表的内置方法copy就可以实现: s = [[1,2],3,4]s1 = s.copy()print ...
- python学习之深浅拷贝
4.2 深浅拷贝 4.2.1 认识 首先应该知道python中变量在内存中是怎么存放的! 在python中,变量与变量的值占用不同的内存.变量占用的内存,并非直接存储数值,而存储的是值在内存中的地址. ...
- Python系列 18 深浅拷贝
拷贝 copy即拷贝,意在将相同的数据进行复制,以便将复制出的副本应用于不同的操作上,而本体不会受到任何影响. 绝大多数语言中都有深浅拷贝的概念,故此篇文章也是属于通用性文章. 在Python中,除开 ...
- python绘图颜色深浅代表数值_画图理解Python的深浅拷贝
在平常运维工作中,难免会有一些修改服务配置文件的操作,为了安全和可以回滚起见,我们习惯性的会将源配置文件做一个拷贝,这样以来即便配置文件参数被修改错了也没事,可以快速从备份的副本还原回来. 同样,在 ...
- python中的深浅拷贝
1. 浅拷贝 copy.copy 浅拷贝是对于⼀个对象的顶层拷贝 通俗的理解是:拷贝了引⽤,并没有拷贝内容 浅拷贝只复制第一层数据,更深层的引用不管. 2. 深拷贝 copy.dee ...
最新文章
- vlc集成c#_C# Winform开发程序调用VLC播放器控件播放视频.
- qiankun 传统项目配置_微前端 qiankun 项目实践
- Link Vision 打破传统视频监控模式,开启新型物联网智能视频服务
- 华为机试HJ54:表达式求值
- Windows下Jenkins的详细安装及使用
- MES系统整体解决方案
- 学习Java,你能做这些工作:
- TSL2561 STM32驱动程序
- 哥本哈根大学物理学家研制的创新芯片解决了量子难题;高通风投投资量子机器公司 | 全球量子科技与工业快讯第四十二期
- 韦东山第3期嵌入式Linux项目-视频监控-1-v4l2视频框架分析
- 华硕 X542UQ REV:2.1
- 公司邮箱登录入口哪个方便,邮箱移动办公哪个最好用?
- 医学计算机论文,医学图像数据库-外文翻译(计算机论文,医学论文适合)
- 【JVM · 字节码】指令集 解析说明
- 计算机boot进入u盘启动,戴尔服务器怎么进入u盘启动模式 选择oneshotbios
- Oracle打补丁步骤
- nodejs中使用jwt
- 玉米、水稻、甘蔗等农作物图片数据集
- 如何顺利通过 PMP 考试?
- ChatGPT聊天软件开发
热门文章
- 树莓派选型(B、A、Zero)
- pq算法matlab仿真,基于MATLAB电力系统PQ潮流计算程序设计最终版(模版2)
- axios下载大文件_前端多线程大文件下载实践,提速10倍(拿捏百度云盘)
- 测试过程分为哪些阶段
- apple充值不能自定义_如何自定义Apple CarPlay屏幕
- PCB模块化设计15——RF接口模块PCB布局布线设计规范
- 医院计算机中心主任,秦皇岛妇幼保健院计算机中心主任刘宇:浅谈妇幼专科医院信息化建设...
- chmod 权限-rw-r--r--表示什么含义
- nextjs使用scss或less
- [C5/C6] 机器学习诊断和系统设计(Machine learning Diagnostic and System Desig