python 深copy和浅copy

http://blog.csdn.net/hong201/article/details/4127092

python整理二十五——谈谈浅拷贝与深拷贝

分类: Python 4630人阅读 评论(4) 收藏 举报
python c import list

python中的浅拷贝深拷贝的概念和C++里面的浅拷贝深拷贝是一样的。所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝,边看例子边解释:

 

#1

[python] view plain copy
  1. >>> ls1 = [1,2,3,4,5]  
  2. >>> c_ls1 = ls1  
  3. >>> c_ls1[-1] = -1  
  4. >>> ls1  
  5. [1234, -1]  
  6. >>> c_ls1  
  7. [1234, -1]  

 

上面的例子,复制操作 c_ls1 = ls1,是浅拷贝,当c_ls1的值改变的时候,ls1的值跟着改变

 

#2

[python] view plain copy
  1. >>> ls1 = [1,2,3,4,5]  
  2. >>> c_ls2 = [ i for i in ls1]  
  3. >>> ls1  
  4. [12345]  
  5. >>> c_ls2  
  6. [12345]  
  7. >>> c_ls2[-1] = -11  
  8. >>> ls1  
  9. [12345]  
  10. >>>   

 

上面的例子,用for循环生成新的list对象,当改变c_ls2的值时,ls1的值没有跟着改变,这就是深拷贝吗?且继续往下看:

 

#3

[python] view plain copy
  1. >>> ls1 = [123, [1,2009] ]  
  2. >>> c_ls3 = [ i for i in ls1 ]  
  3. >>> ls1  
  4. [123, [12009]]  
  5. >>> c_ls3  
  6. [123, [12009]]  
  7. >>> c_ls3[-1].append(2009)  
  8. >>> c_ls3  
  9. [123, [120092009]]  
  10. >>> ls1  
  11. [123, [120092009]]  
  12. >>>   

 

#3 和  #2难道有矛盾?不。

解释:for循环操作的时候,把ls1中的每一个对象的引用拷贝,而ls1中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:

 

#4

[python] view plain copy
  1. >>> for i in ls1:  
  2. ...     print id(i)  
  3. ...       
  4. 3630168  
  5. 3630156  
  6. 3630144  
  7. 46784880  
  8. >>> for i in c_ls3:  
  9. ...     print id(i)  
  10. ...       
  11. 3630168  
  12. 3630156  
  13. 3630144  
  14. 46784880  

 

id(obj)可以看做C++里面的对象内存地址。

 

那么,在pyhton,深拷贝在哪呢?不急,下面就是了

#5

[python] view plain copy
  1. >>> import copy  
  2. >>> ls1 = [123, [1,2009] ]  
  3. >>> c_ls5 = copy.deepcopy(ls1)  
  4. >>> ls1  
  5. [123, [12009]]  
  6. >>> c_ls5  
  7. [123, [12009]]  
  8. >>> c_ls5[-1].append(2009)  
  9. >>> c_ls5  
  10. [123, [120092009]]  
  11. >>> ls1  
  12. [123, [12009]]  

 

 

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


你可能感兴趣的:(python)