python 深拷贝、浅拷贝

深拷贝和浅拷贝针对的是可变类型而言,对于不可变类型,不存在这个问题,当修改不可变对象时,会重新开辟一块内存空间,而可变对象,是在原内存空间修改。

a = "asdas"
b = a
print(id(a))
print(id(b))
a = "qqq"
print(id(a))
print(id(b))
print(a, b)

输出结果为:

2219925075256
2219925075256
2219925075424
2219925075256
qqq asdas

对于直接赋值(=)、深拷贝、浅拷贝

直接赋值是将原对象的引用赋值给变量,两个对象都指向同一块内存地址。

a = [1, 2, 3, [4, 5, 6]]
b = a
print(id(a))
print(id(b))
a[0] = "qqq"
print(id(a))
print(id(b))
print(a, b)

输出结果:

2006021726920
2006021726920
2006021726920
2006021726920
['qqq', 2, 3, [4, 5, 6]] ['qqq', 2, 3, [4, 5, 6]]

浅拷贝是将原对象重新拷贝一份赋值给变量,两个对象指向不同的内存地址,但是,对于原对象的子元素如果是可变对象,则复制的内存地址,因此,如果原对象的子元素改变,新对象的子元素也会改变。

复制代码
import copy

a = [1, 2, 3, [4, 5, 6]]
b = copy.copy(a)
print(id(a))
print(id(b))
a[0] = "qqq"
print(id(a))
print(id(b))
print(a, b)
复制代码

输出结果为:

2099093564872
2099093658184
2099093564872
2099093658184
['qqq', 2, 3, [4, 5, 6]] [1, 2, 3, [4, 5, 6]]

当修改子元素时:

复制代码
import copy

a = [1, 2, 3, [4, 5, 6]]
b = copy.copy(a)
print("a地址:", id(a))
print("b地址:", id(b))
print("a子元素:", id(a[3]))
print("b子元素:", id(b[3]))
a[3][1] = "qqq"
print(a, b)
复制代码

输出结果为:

a地址: 1256840228360
b地址: 1256840321928
a子元素: 1256840163912
b子元素: 1256840163912
[1, 2, 3, [4, 'qqq', 6]] [1, 2, 3, [4, 'qqq', 6]]

深拷贝则是完完全全重新复制一份原对象赋值给变量,两个对象之间毫无关系了。

复制代码
import copy

a = [1, 2, 3, [4, 5, 6]]
b = copy.deepcopy(a)
print("a地址:", id(a))
print("b地址:", id(b))
print("a子元素:", id(a[3]))
print("b子元素:", id(b[3]))
a[3][1] = "qqq"
print(a, b)
复制代码

输出结果为:

a地址: 2025980030472
b地址: 2025980124104
a子元素: 2025979966024
b子元素: 2025980123080
[1, 2, 3, [4, 'qqq', 6]] [1, 2, 3, [4, 5, 6]]

 

posted @   守望人间  阅读(295)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示