拷贝的初级思维,新人上纲上线,简单剖析,希望给点建议 1、= 2、copy 3、deepcopy 区分

这里个人解析一下1、= 2、copy 3、deepcopy

= 只包含等号右边的值赋给左边的变量,具体右边如何变化,不论。右边最终的值贴上的还是左边的标签改变左边的最终值,不会影响贴上的标签,只是值包含在其中。看下面例子

例一

a = 1
b = a
a = 2
print(a, b)
# '''运行结果为: 2  1 '''

左边的值 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是可以拷贝一个,一摸一样的原有数据,相对独立的存在,不会有任何影响干扰,这才是我们生活中常用到的拷贝。这才是真正的拷贝

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值