在CSDN找的帖子,
但是我个人的感觉是要说清楚一些东西,帮助新手。
字典是自带有copy的方法的,也就是淺拷贝,但是list and tuple没有的
下面的例子也有导入了copy模块的,这个是python自带的模块的。
我们可以通过ID来检验我们的复制的形式。
有疑问可以留言。。。
或者访问home of python
python中的浅拷贝深拷贝的概念和C++里面的浅拷贝深拷贝是一样的。所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝,边看例子边
解释:
#1
view plain
>>> 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
view plain
>>> 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
view plain
>>> 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
view plain
>>> 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
view plain
>>> 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]]
深拷贝,浅拷贝,掌握之中……