http://blog.csdn.net/hong201/article/details/4127092
python整理二十五——谈谈浅拷贝与深拷贝
分类: Python
2009-04-26 23:31
4630人阅读
收藏
举报
python c import list
python中的浅拷贝深拷贝的概念和C++里面的浅拷贝深拷贝是一样的。所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝,边看例子边解释:
#1
- >>> ls1 = [1,2,3,4,5]
- >>> c_ls1 = ls1
- >>> c_ls1[-1] = -1
- >>> ls1
- [1, 2, 3, 4, -1]
- >>> c_ls1
- [1, 2, 3, 4, -1]
上面的例子,复制操作 c_ls1 = ls1,是浅拷贝,当c_ls1的值改变的时候,ls1的值跟着改变
#2
- >>> ls1 = [1,2,3,4,5]
- >>> c_ls2 = [ i for i in ls1]
- >>> ls1
- [1, 2, 3, 4, 5]
- >>> c_ls2
- [1, 2, 3, 4, 5]
- >>> c_ls2[-1] = -11
- >>> ls1
- [1, 2, 3, 4, 5]
- >>>
上面的例子,用for循环生成新的list对象,当改变c_ls2的值时,ls1的值没有跟着改变,这就是深拷贝吗?且继续往下看:
#3
- >>> ls1 = [1, 2, 3, [1,2009] ]
- >>> c_ls3 = [ i for i in ls1 ]
- >>> ls1
- [1, 2, 3, [1, 2009]]
- >>> c_ls3
- [1, 2, 3, [1, 2009]]
- >>> c_ls3[-1].append(2009)
- >>> c_ls3
- [1, 2, 3, [1, 2009, 2009]]
- >>> ls1
- [1, 2, 3, [1, 2009, 2009]]
- >>>
#3 和 #2难道有矛盾?不。
解释:for循环操作的时候,把ls1中的每一个对象的引用拷贝,而ls1中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:
#4
- >>> for i in ls1:
- ... print id(i)
- ...
- 3630168
- 3630156
- 3630144
- 46784880
- >>> for i in c_ls3:
- ... print id(i)
- ...
- 3630168
- 3630156
- 3630144
- 46784880
id(obj)可以看做C++里面的对象内存地址。
那么,在pyhton,深拷贝在哪呢?不急,下面就是了
#5
- >>> import copy
- >>> ls1 = [1, 2, 3, [1,2009] ]
- >>> c_ls5 = copy.deepcopy(ls1)
- >>> ls1
- [1, 2, 3, [1, 2009]]
- >>> c_ls5
- [1, 2, 3, [1, 2009]]
- >>> c_ls5[-1].append(2009)
- >>> c_ls5
- [1, 2, 3, [1, 2009, 2009]]
- >>> ls1
- [1, 2, 3, [1, 2009]]
深拷贝,浅拷贝,掌握之中……