python - 浅拷贝
前言
在Python中一切皆对象,任何对象都有三个属性:唯一标识、类型、值。
id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。
对于某个对象,如何创建它的拷贝,就是说如何创建与该对象具有相同值的另外一个对象?
L1 = [[1, 2], 9]
L2 = L1[:] # 使用切片
print(L2) # [[1, 2], 9]
判断 L1 和 L2 是否使用了相同的内存地址。
L1 = [[1, 2], 9]
L2 = L1[:]
print(L2) # [[1, 2], 9]
print("L1内存地址:%s" % id(L1)) # 3757064
print("L2内存地址:%s" % id(L2)) # 31379592
由此可见,L1和L2使用了不同的内存地址。
判断 L1 和L2 中对应的两个元素引用的列表对象是否一样
L1 = [[1, 2], 9]
L2 = L1[:]
print(L2) # [[1, 2], 9]
print("L1[0]内存地址:%s" % id(L1[0])) # 1856008
print("L2[0]内存地址:%s" % id(L2[0])) # 1856008
print("L1[1]内存地址:%s" % id(L1[1])) # 8791123393856
print("L2[1]内存地址:%s" % id(L2[1])) # 8791123393856
列表 L1 和 L2 中的整数对象的内存地址是一样的。
浅拷贝
对于某个对象,虽然创建了与该对象具有相同值的另外一个对象,但是这两个对象内部嵌套的对应子对象全部都是同一个对象。就是说外部进行了拷贝,内部没有进行拷贝。
总结
以下方式得到的拷贝都是浅拷贝:
1、切片操作
2、调用列表、字典、集合的操作 copy
3、调用标准库模块copy中的copy
L2 = L1.copy()
L2 = list(L1)
L2 = copy.copy(L1)
得到的结果都是一样的
不可变对象: 字符串、元祖、整数等
可变对象:列表、字典
修改列表对象:
L1 = [[3, 6], 8]
L2 = L1[:]
L1[0][1] = 7
L1[1] = 9
print(L1) # [[3, 7], 9]
print(L2) # [[3, 7], 8]
总结:
1、对不可变对象拷贝时,浅拷贝不开辟新空间,相当于赋值操作。
2、浅拷贝在拷贝时,只会copy一层,在内存中开辟一个空间,存放这个copy的列表。更深的层次并没有copy,即第二层用的都是同一个内存。
3、可变对象浅拷贝时,只拷贝第一层中的引用。
------分界线------
成功的背后,是做 难 而正确的事,
什么是正确的事?
呐 像这, 读书,写文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现