您的位置:首页 > 编程语言 > Python开发

关于Python 浅拷贝与深拷贝的一些理解

2016-09-11 17:26 435 查看
Python中有两样东西
一类是标签
一类是对象
对象必须有标签指向才能够被使用
所有对于对象的方法调用,变量的赋值都是通过对象的标签来实现的,以下的两种情况均不正常
没有标签的对象会被当做垃圾销毁
没有对象的标签也不能够使用
列表由于可以存放一切的对象 比如
list=[1,"a",[1,2,3]] 本质上是列表中本身存放的是对象的引用 即对象的标签
所以对一个列表进行浅复制则是仅仅是创造了新的列表本身的内存,然而新的内存中装的内容即原来列表中对象的引用却仅仅是复制了引用,复制了这些引用 但是并没有真正的复制这些对象的内容
下面代码的执行结果可以看出
#----------------------deepcopy到底有几个层次的拷贝----------------

list0=[1,"1st_list",[2,"2nd_list",[3,"3rd_list",[4,"last"]]]]
print("in original list0")
print("in list0")
print("1st_list id is ",id(list0))
print("2nd_list id is ",id(list0[2]))
print("3rd_list id is ",id(list0[2][2]))
print("4th_list id is ",id(list0[2][2][2]))

print("\n\n--------------")
list1=copy.copy(list0)
print("called copy(list0)\n")
print("in list1")
print("1st_list id is ",id(list1))
print("2nd_list id is ",id(list1[2]))
print("3rd_list id is ",id(list1[2][2]))
print("4th_list id is ",id(list1[2][2][2]))

print("\n\n--------------")
list2=copy.deepcopy(list0)
print("called deepcopy(list0)\n")
print("in list2")
print("1st_list id is ",id(list2))
print("2nd_list id is ",id(list2[2]))
print("3rd_list id is ",id(list2[2][2]))
print("4th_list id is ",id(list2[2][2][2]))

运行结果:
list0=[1,"1st_list",[2,"2nd_list",[3,"3rd_list",[4,"last"]]]]
in original list0
in list0
1st_list id is 24340840
2nd_list id is 24339760
3rd_list id is 24339440
4th_list id is 24340800

--------------
called copy(list0)

in list1
1st_list id is 16073872
2nd_list id is 24339760
3rd_list id is 24339440
4th_list id is 24340800

--------------
called deepcopy(list0)

in list2
1st_list id is 24340000
2nd_list id is 24340120
3rd_list id is 24340240
4th_list id is 24340200

可以看出使用copy时仅仅第一级list本身的内存空间(第一行蓝色)被拷贝 然而其中的对象的内存(后三行红色)均没有被拷贝(id全部一样)
而调用deepcopy后 之后所有的多级list的内存空间均被拷贝(id全部不同了)
所以copy和deepcopy的区别在于
对待对象中的子对象上

copy只拷贝对象本身,子对象只拷贝引用不拷贝子对象的内存空间
而对于deepcopy() 拷贝子对象时联通子对象的内存空间一起拷贝
形象一点画成图最上面括号为原始的对象 方框为子对象 quote为引用
中间为浅拷贝和原始对象公用子对象 他们的子对象内存空间相同
最后一个为深拷贝 深拷贝从内存空间上拷贝了所有的子对象 和原始对象在内存空间上没有任何关联
可以看出

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 对象 深拷贝