关于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为引用
中间为浅拷贝和原始对象公用子对象 他们的子对象内存空间相同
最后一个为深拷贝 深拷贝从内存空间上拷贝了所有的子对象 和原始对象在内存空间上没有任何关联
可以看出
一类是标签
一类是对象
对象必须有标签指向才能够被使用
所有对于对象的方法调用,变量的赋值都是通过对象的标签来实现的,以下的两种情况均不正常
没有标签的对象会被当做垃圾销毁
没有对象的标签也不能够使用
列表由于可以存放一切的对象 比如
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编码的一些理解
- 关于python锁的一些个人理解
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
- 关于Python2/3多进程的一些个人理解
- 关于Python中深拷贝与浅拷贝的理解(一)---概念
- 关于python中decode和encode的一些理解
- 关于Python中深拷贝与浅拷贝的理解(一)---概念
- 关于Python中深拷贝与浅拷贝的理解(二)---排bug
- 关于Python里面协程的一些理解
- 关于python的拷贝,赋值理解
- 关于选用Python IDE的一些思考
- 关于unicode、utf8、utf16、gb2312和GBK的一些理解
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解
- 关于Script.NET Python开发包的一些问题解答
- 关于委托的一些理解
- [python-chinese] 我对字符编码的一些理解
- 对关于字符驱动的一些重要数据结构(file_operations, file, inode, cdev)的理解
- 关于C#3.0和.net一些问题的理解
- 关于c#中的一些感念的理解。
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解