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、可变对象浅拷贝时,只拷贝第一层中的引用。

------分界线------

成功的背后,是做 难 而正确的事,
什么是正确的事?
呐 像这, 读书,写文章。
posted @   西瓜_皮  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示