Python学习【第3篇】:Python_ 深浅拷贝

Python:深浅拷贝

1. str / int / bool

#内存中开辟空间,将值取出来,两者地址不同(注意小数据池) a = "alex" b = copy.copy(a) c = copy.deepcopy(a) #两份地址 b==a==c

2. List / Set / dict

# v1 = [1,2,3] # # v2 = copy.copy(v1) #将第一层的空壳拷贝一份,里面元素地址一样(与v1中元素地址一样),没有新开辟内存 # print(id(v1),id(v2)) #不一样 # v3 = copy.deepcopy(v1) #将v1中所有的可变类型数据拷贝(新建)一份,不可变类型跟浅拷贝一样,没有新开辟内存 # print(v1 is v3) # print(id(v1),id(v3)) #不一样 # v1 = [1,2,[33,99]] # #浅拷贝只拷贝了最外层 # v2 = copy.copy(v1) # 将第一层的空壳拷贝一份,里面的数据都是指向v1中数据的内存 # print(id(v1),id(v2)) # 不一样 # print(id(v1[2]),id(v2[2])) # 一样 # # #深拷贝:拷贝嵌套层次中的所有可变类型 # v3 = copy.deepcopy(v1) # 将v1中所有的可变类型数据拷贝(新建)一份,里面可变类型元素的地址不一样,不可变类型跟浅拷贝一样,新开辟了内存 # print(id(v1),id(v2)) # 不一样 # print(id(v1[2]),id(v2[2])) # 不一样

3. 练习题

v1 = [1,2,3,{33,99}] #可变数据类型 dict、list、set v2 = copy.deepcopy(v1) print(v1 == v2) #True print(v1 is v2) #False print(v1[0] is v2[0]) #True print(v1[3] == v2[3]) #True print(v1[3] is v2[3]) #False

4. 特殊情况

# #特殊情况:如果tuple里面有可变类型,那么深拷贝时会重新创建一份 # v1 = (1,2,3,4) # # v2 = copy.copy(v1) # print(id(v1),id(v2)) # 一样 # v3 = copy.deepcopy(v1) # print(id(v1),id(v3)) # 一样 # v1 = (1,2,3,[1,2,3],4) # # v2 = copy.copy(v1) # print(id(v1),id(v2)) # 一样 # v3 = copy.deepcopy(v1) # print(id(v1),id(v3)) # 一样

注意:对元素中不可变类型,更新操作会另外开辟空间,不影响已经拷贝的

v1 = [1,2,3,4] v2 = copy.copy(v1) v1[1] = 99 for i in v1: print(i,end=' ') # 1 99 3 4 print() for i in v2: print(i,end=' ') # 1 2 3 4
  • 总结:深浅拷贝都不能拷贝不可变数据类型,浅拷贝只拷贝最外层(相当于只拷贝一层),深拷贝拷贝所有嵌套层次的可变类型。

__EOF__

本文作者The1Yu
本文链接https://www.cnblogs.com/The1Yu/p/14552448.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   The1Yu  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示