免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3543 | 回复: 15

一个关于深,浅拷贝问题。我这样理解对吗? [复制链接]

论坛徽章:
0
发表于 2009-03-30 17:02 |显示全部楼层
这个理解起来就是说,如果是一个容器(你可以理解为一个自定义的大型数据),而非系统数据类型,比如int float什么的,那么在拷贝的时候容器的大小是无法估量的。就像你在C/C++里面传递一个数组一样,你不可能把数整个拷贝过去,而仅仅传递一个指针.python中也一样,当容器间的拷贝时,只是产生类似指针一样的地址指向。
第一次实验:简单的=号赋值
>>> person=['name', ['savings', 100.00]]  //这里是一个容器
>>> hubby=person                                        //识别为类似指针
>>> wifey=person
>>> hubby[0]='abc'
>>> wifey[1][1]=789
>>> person,hubby,wifey
(['abc', ['savings', 789]], ['abc', ['savings', 789]], ['abc', ['savings', 789]])  /不相信可以用id()函数查看,内部地址一样

第二次实验:函数返回
>>> person=['name', ['savings', 100.00]]
>>> hubby = person[:]                                //一个函数返回,进行一个个元素拷贝。'name'是一个系统类型,被独立拷贝.而后者就是所谓的容器,产生                                                      //一个引用
>>> hubby[0]='abc'
>>> hubby[1][1]=789
>>> person,hubby
(['name', ['savings', 789]], ['abc', ['savings', 789]]) //第一个相当深拷贝了,所以不同。

论坛徽章:
0
发表于 2009-03-30 17:04 |显示全部楼层
难道这两种赋值等号重载的方法不一样?

论坛徽章:
0
发表于 2009-03-30 17:09 |显示全部楼层
忘记说环境了。
WINDOWS 2.5.3
PYTHON自带的编译器调试结果

论坛徽章:
0
发表于 2009-03-30 17:18 |显示全部楼层
讲错了!!!:wink:

[ 本帖最后由 izhier 于 2009-3-30 17:37 编辑 ]

论坛徽章:
0
发表于 2009-03-30 17:18 |显示全部楼层
原帖由 lin_style 于 2009-3-30 17:09 发表
忘记说环境了。
WINDOWS 2.5.3
PYTHON自带的编译器调试结果

>>> import copy
>>> a=[1,2,[3,4]]
>>> b=a[:]
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> id(a)
20055504
>>> id(b)
20074624
>>> id(c)
20063456
>>> id(d)
20070528
>>> a[2][0]='a'
>>> print a
[1, 2, ['a', 4]]
>>> print b
[1, 2, ['a', 4]]
>>> print c
[1, 2, ['a', 4]]
>>> print d
[1, 2, [3, 4]]

论坛徽章:
0
发表于 2009-03-30 17:24 |显示全部楼层

回复 #5 zhenglxd 的帖子

深和浅都生成新的对象
b和c是浅copy
d是deepcopy
对于列表中套列表
列表中的列表如果发生该表 浅copy会变 深copy不会
其他地方都一样

论坛徽章:
0
发表于 2009-03-30 17:25 |显示全部楼层

回复 #6 zhenglxd 的帖子

深copy和浅copy都是copy生成一个新的对象
区别在于浅copy是直接copy 原始对象的ob[0]计数
比如说
a = [1, 2, 3, 4, ['a', 'b']]
在这里[1, 2, 3, 4, ['a', 'b']]是ob[0]
a是对他的引用ob[1]
所以任何对a的操作不会改变copy的结果但是对ob[0]的操作则会改变
而deep copy则是对象a的完全copy也就是不会随着a和父对象而改变


这个是我的笔记 要搞清楚是 改变引用还是改变本身。。

论坛徽章:
0
发表于 2009-03-30 17:28 |显示全部楼层
深拷贝是完全的克隆

浅拷贝复制对象的公共的属性

论坛徽章:
0
发表于 2009-03-30 17:29 |显示全部楼层
7楼说的对,上面我讲解有误,再改一下

  1. • A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to
  2. the objects found in the original.
  3. • A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found
  4. in the original.
复制代码

[ 本帖最后由 izhier 于 2009-3-30 17:32 编辑 ]

论坛徽章:
0
发表于 2009-03-30 17:48 |显示全部楼层
==
等我吃饭回来看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP