免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3290 | 回复: 3
打印 上一主题 下一主题

列表类型的浅副本和深副本的测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-30 21:56 |只看该作者 |倒序浏览
无意间发现列表类型这样的现象,希望大家提出自己的看法,以下是代码,很简单
#-------Code start---------------------#
import string

list3 = ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4 = list3
print 'list4>;>;>;', list4
list3.pop(0)
print 'list3>;>;>;', list3
print 'list4>;>;>;', list4

list3 = ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4 = list3
print 'list4>;>;>;', list4
list3[3].pop(0)
print 'list3>;>;>;', list3
print 'list4>;>;>;', list4

list3 = ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4 = list3[:]
print 'list4>;>;>;', list4
list3.pop(0)
print 'list3>;>;>;', list3
print 'list4>;>;>;', list4

list3 = ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4 = list3[:]
print 'list4>;>;>;', list4
list3[3].pop(0)
print 'list3>;>;>;', list3
print 'list4>;>;>;', list4
#-------Code start---------------------#
运行结果:
list4>;>;>; ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list3>;>;>; ['bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4>;>;>; ['bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']

list4>;>;>; ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list3>;>;>; ['aa', 'bb', 'cc', ['ww', 'ee', 'rr'], 'dd']
list4>;>;>; ['aa', 'bb', 'cc', ['ww', 'ee', 'rr'], 'dd']

list4>;>;>; ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list3>;>;>; ['bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list4>;>;>; ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']

list4>;>;>; ['aa', 'bb', 'cc', ['qq', 'ww', 'ee', 'rr'], 'dd']
list3>;>;>; ['aa', 'bb', 'cc', ['ww', 'ee', 'rr'], 'dd']
list4>;>;>; ['aa', 'bb', 'cc', ['ww', 'ee', 'rr'], 'dd']

从结果来看,由于赋值方式不同,删除列表中的元素时也出现不同的情况。
原以为 list4=list3[:]这样的赋值后list4就与list3没有任何关系了,看来不是这样的。对于深副表的操作不管是用什么方法赋值都是对list3和list4起同样做作的。

论坛徽章:
0
2 [报告]
发表于 2005-10-02 19:01 |只看该作者

列表类型的浅副本和深副本的测试

对于python的对象赋值需要知道python是对象引用,因此对于a=b的涵义就是把b的引用传给a。因此对于一个list,只是简单的a=b,这样得到的a只是增加了对原list的一个引用,并不会产生真正与原来list不同的对象。对于a=b[:]这种形式,它也只能重新生成第一层的列表元素。这在python中叫浅拷贝,这一现象对于dict也存在。因此python中专门有一个模块叫copy,它可以处理浅拷贝和深拷贝。浅拷贝就处理第一层,深拷贝则处理所有深度。copy.deepcopy()。因此根据你的需求你需要有选择地使用这两种拷贝。

论坛徽章:
0
3 [报告]
发表于 2005-10-04 10:23 |只看该作者

列表类型的浅副本和深副本的测试

原来如此,多谢limodou的指点。又长知识了。

论坛徽章:
0
4 [报告]
发表于 2005-10-08 09:13 |只看该作者

列表类型的浅副本和深副本的测试

建议多看看python的语法和基础知识,从其他语言转过来的朋友可能对这部分忽略了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP