深浅拷贝

0 views
Skip to first unread message

丅一站→火星

unread,
Sep 18, 2011, 11:28:42 AM9/18/11
to home of python
深浅拷贝---python篇 2011-09-18 23:25:54| 分类: python | 标签: |字号大中小 订阅 .

在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]]


深拷贝,浅拷贝,掌握之中……

Reply all
Reply to author
Forward
0 new messages