鱼C论坛

 找回密码
 立即注册
查看: 1288|回复: 2

[已解决]第12讲 关于python的赋值,浅拷贝,深拷贝

[复制链接]
发表于 2017-9-28 06:43:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 方糖 于 2017-9-28 07:05 编辑
list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
list2 = list1.copy()
list1[1][2] = ['小鱿鱼']
print(list1, list2, sep='\n')
list1[3] = 'test'
print(list1, list2, sep='\n')

copy属于浅拷贝,查了下浅拷贝的定义:
1、赋值:简单地拷贝对象的引用,两个对象的id相同。
2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。
3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

因为个人诸多混乱的实例所以有点没明白,仔细的读了深拷贝后,已经懂了,这个删帖是要申请么?各位看帖的鱼油原谅我
最佳答案
2017-9-28 11:20:52
为了最佳答案,我来举实例对比赋值、浅拷贝和深拷贝的区别。
赋值:简单的拷贝对象的引言,两个对象的id相同
例如
>>> list1 = ['小甲鱼',3,[5,7]]
>>> list2 = list1     #赋值操作
>>> print(id(list1),id(list2))   #打印两个变量的id值
51724616 51724616              #id值相同
>>> list2.append(9)              #list2列表增加一个元素9
>>> print(list1,list2)
['小甲鱼', 3, [5, 7], 9] ['小甲鱼', 3, [5, 7], 9]      #两者元素值完全相同
浅拷贝:穿件一个新的组合对象,这个新对象和原对象共享内存中的子对象
>>> list3 = list1.copy()                                  #list3是list1的浅拷贝
>>> list3.append(11)                                     #list3新增加一个元素11
>>> print(list1,list3)                                   
['小甲鱼', 3, [5, 7], 9] ['小甲鱼', 3, [5, 7], 9, 11]   #list1中不会增加新元素
>>> print(id(list1),id(list3))                              #显示两个列表id
51724616 52341064                                        #浅拷贝id不同
>>> list3[2].append(8)                                   # list3列表内的子列表增加一个元素8
>>> print(list1,list3)
['小甲鱼', 3, [5, 7, 8], 9] ['小甲鱼', 3, [5, 7, 8], 9, 11]    #两个列表中的子列表都多了元素8
>>> print([id(eid) for eid in list3])                            #打印列表3内元素id
[52362288, 495812864, 52056584, 495813056, 495813120]
>>> print([id(eid) for eid in list1])                             #打印列表1内元素id
[52362288, 495812864, 52056584, 495813056]        #通过对比发现元素id一致
>>> list3[0] = '小牛'                                                  #将列表3内的第一个元素更改为'小牛'
>>> print([id(eid) for eid in list3])
[52377976, 495812864, 52056584, 495813056, 495813120]   #由于字符串属于不可变类型,重新给了新id
>>> print(list1,list3)
['小甲鱼', 3, [5, 7, 8], 9] ['小牛', 3, [5, 7, 8], 9, 11]      #导致两者结果不一致
>>> import copy                                                   #引入拷贝模块
>>> list4 = copy.deepcopy(list1)                         #深拷贝
>>> print([id(eid) for eid in list1])
[52362288, 495812864, 52056584, 495813056]
>>> print([id(eid) for eid in list3])
[52377976, 495812864, 52056584, 495813056, 495813120]   
>>> print([id(eid) for eid in list4])
[52362288, 495812864, 51731656, 495813056]   对比发现子列表地址不一致
>>> list4[2].append(10)
>>> print(list1,list4)                  
['小甲鱼', 3, [5, 7, 8], 9] ['小甲鱼', 3, [5, 7, 8, 10], 9]     #对比发现子列表结果不一致了
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-28 08:58:08 | 显示全部楼层
你可以把自己懂了的东西在帖子里和大家分享一下。
如果你觉得这个建议不错,可以赐我一个最佳答案
然后,就可以完事儿了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 11:20:52 | 显示全部楼层    本楼为最佳答案   
为了最佳答案,我来举实例对比赋值、浅拷贝和深拷贝的区别。
赋值:简单的拷贝对象的引言,两个对象的id相同
例如
>>> list1 = ['小甲鱼',3,[5,7]]
>>> list2 = list1     #赋值操作
>>> print(id(list1),id(list2))   #打印两个变量的id值
51724616 51724616              #id值相同
>>> list2.append(9)              #list2列表增加一个元素9
>>> print(list1,list2)
['小甲鱼', 3, [5, 7], 9] ['小甲鱼', 3, [5, 7], 9]      #两者元素值完全相同
浅拷贝:穿件一个新的组合对象,这个新对象和原对象共享内存中的子对象
>>> list3 = list1.copy()                                  #list3是list1的浅拷贝
>>> list3.append(11)                                     #list3新增加一个元素11
>>> print(list1,list3)                                   
['小甲鱼', 3, [5, 7], 9] ['小甲鱼', 3, [5, 7], 9, 11]   #list1中不会增加新元素
>>> print(id(list1),id(list3))                              #显示两个列表id
51724616 52341064                                        #浅拷贝id不同
>>> list3[2].append(8)                                   # list3列表内的子列表增加一个元素8
>>> print(list1,list3)
['小甲鱼', 3, [5, 7, 8], 9] ['小甲鱼', 3, [5, 7, 8], 9, 11]    #两个列表中的子列表都多了元素8
>>> print([id(eid) for eid in list3])                            #打印列表3内元素id
[52362288, 495812864, 52056584, 495813056, 495813120]
>>> print([id(eid) for eid in list1])                             #打印列表1内元素id
[52362288, 495812864, 52056584, 495813056]        #通过对比发现元素id一致
>>> list3[0] = '小牛'                                                  #将列表3内的第一个元素更改为'小牛'
>>> print([id(eid) for eid in list3])
[52377976, 495812864, 52056584, 495813056, 495813120]   #由于字符串属于不可变类型,重新给了新id
>>> print(list1,list3)
['小甲鱼', 3, [5, 7, 8], 9] ['小牛', 3, [5, 7, 8], 9, 11]      #导致两者结果不一致
>>> import copy                                                   #引入拷贝模块
>>> list4 = copy.deepcopy(list1)                         #深拷贝
>>> print([id(eid) for eid in list1])
[52362288, 495812864, 52056584, 495813056]
>>> print([id(eid) for eid in list3])
[52377976, 495812864, 52056584, 495813056, 495813120]   
>>> print([id(eid) for eid in list4])
[52362288, 495812864, 51731656, 495813056]   对比发现子列表地址不一致
>>> list4[2].append(10)
>>> print(list1,list4)                  
['小甲鱼', 3, [5, 7, 8], 9] ['小甲鱼', 3, [5, 7, 8, 10], 9]     #对比发现子列表结果不一致了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表