这里个人解析一下1、= 2、copy 3、deepcopy
= 只包含等号右边的值赋给左边的变量,具体右边如何变化,不论。右边最终的值贴上的还是左边的标签改变左边的最终值,不会影响贴上的标签,只是值包含在其中。看下面例子
例一
a = 1
b = a
a = 2
print(a, b)
左边的值 1 赋给 变量 a , 此时 1 贴上 a 的标签,再将 a 的值赋给变量 b 此时 1 有了a 和 b 的两个标签,这时将 2 赋给变量 a 此时,将 a 的标签撕下来,贴在了 2 的上面,
原有的值 1 此时没有 a 的标签只有 b 的标签了 , 那我们在看一个例子 第一段程序是 = 号 第二段程序是 通过删除里面的元素,计算是否变化
例二
nums = [17, 18, 19, 20]
nums1 = nums
nums = [18, 19, 20, 21]
print(nums, nums1)
'''此时运行结果为:[18, 19, 20, 21] [17, 18, 19, 20]'''
这个例子,使用我们刚才说的 = 号的方式没有任何问题。看下面
例三
nums2 = [17, 39, 28, 51]
nums3 = nums
nums3.pop()
print(len(nums2))
'''此时运行结果为:[17,39,28]'''
类比 列表是一个盒子,这个盒子里面有 有四个小盒子或者是其他的物体,因为列表是可变的,所以我们四个盒子可以是不固定的,也可能会存在更小的盒子,
这个可以理解为:在操作的过程中不可豁免的,因为流程需要,里面的小盒子随时都有可能增加或减少,或者发生其他变化
这时我们看到例子,我们考虑一下,此时变量 nums2 被给到一个列表[17, 39, 28, 51] ,实际给到的是一个列表,但并不是列表里面的值 , 列表值可变化 此时列表[17, 39, 28, 51] 被贴上一个标签 nums2
我们这时将 nums3 又赋值给到 nums2 此时 [17, 39, 28, 51] 同时有两个标签,
此时重点来了:我们通过列表的函数,一个方法,nums3.pop() 改变了里面的值,但是这并不影响盒子上的标签,所以,改变了里面的值,但不影响 标签a 和 标签b 是相同的,因为他们都代表一个值,尽管变化
具体可以查看我例二实际情况。
但是我们有时候需要解决这个问题啊 ,怎么办尼,就算用的不多,但是还是有这个需求啊,那怎么办尼
哎, 别着急 copy和deepcopy 登场了 ,这个方法解决了 = 号的问题,但是两者也有存在一些区分,从字面翻译上看 copy就是拷贝,deep翻译为加深更深,deepcopy那就是更深得拷贝,来看下面例子
首先得导入 copy 这个模块函数吧
例四
import copy
numlist1 = [17, 22, 39, 58, [55, 43]]
nums4 = copy.copy(numlist1)
print(numlist1 is nums3)
'''此处运行结果为:False'''
首先来看啊,列表 [17, 22, 39, 58, [55, 43]] 赋值给了 numlist1 然后使用copy的方法 → copy.copy(numlist1) 将 numlist 拷贝给了 nums4
这里我拷贝,给列表里面的每一个元素进行 copy ,但需要注意,不代表嵌套元素也可以说是子元素,例如列表内嵌套列表,
例五
numlist2 = [17, 22, 39, 58, [55, 43]]
nums5 = copy.copy(numlist2)
print(numlist2 is nums3)
'''运行结果为:[17, 22, 39, 58, [99, 43]] [17, 22, 39, 58, [99, 43]]'''
这是上面例子,我在增加一些其他操作
numlist2[-1][0] = 99
print(numlist2, nums5)
numlist2.pop(1)
print(numlist2, nums5)
'''运行结果为:[17, 39, 58, [99, 43]] [17, 22, 39, 58, [99, 43]]'''
根据运行结果,可以产生逆推的形式,或者是我们也可以理解为,将列表这种值里面的每一个值进行固定,我修改我列表其中一个成员,没有受到任何影响,但是我在修改列表子元素时,出现了意外, 拿出上面盒子的例子,
列表是一个大盒子,里面有五个小盒子,我五个盒子的标签我都贴好了也拿过来了,但是有个小盒子里面,装了几个钻石,但是我钻石我也没贴标签,它给我少几个,我也不晓得
我只能拿到盒子,盒子里面的钻石,他要是给我在程序运行中,套走几个,我也不晓得,只能盒子里面原来有几个,我这个就只有几个,
所以里面的东西我控制不了,这也就不是纯拷贝了,他只能比=号多一层而已,还是共享子列表元素,全部那不过来了
这意义就不大了,那只能怎么办尼,那只能任由它随便拿我钻石么,肯定不行的呀是吧 ,这种贵重东西怎么可以,要是不重要的石头,送他都可以,但是钻石不行呀,那怎么办
这时候究极进化的 deepcopy,深拷贝就从内存中挣脱出来,帮我把所有的东西都给贴上标签。并脱离原有的地址,给我新建立一个内容出来,也就是我们完全不一样了,我就把你拷贝出来一次,我就跟你没有关系了
例六
values = [17, 32, [19, 42]]
nums6 = copy.deepcopy(values)
print(values[-1] is nums6[-1])
'''运行结果为:False'''
但是等等
print(values[-1] == nums6[-1])
'''运行结果为:True'''
values[-1][0] = 99
print(values, nums6)
'''运行结果为:[17, 32, [99, 42]] [17, 32, [19, 42]]'''
values.pop()
print(values, nums6)
'''运行结果为:[17, 32] [17, 32, [19, 42]]'''
这里我们做了几个问题的测试
1、values[-1] 是不是 nums6[-1] 结果为:不是
2、values[-1] 等不等于 nums6[-1] 结果为:等于
3、values[-1][0] = 99 修改 values 元素会不会影响 nums6 结果为:不会影响 nums6
4、 values.pop() 删除 values元素会不会影响 nums6 结果为:不会影响 nums6
此时根据情况可以看出,deepcopy是可以拷贝一个,一摸一样的原有数据,相对独立的存在,不会有任何影响干扰,这才是我们生活中常用到的拷贝。这才是真正的拷贝
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构