python浅拷贝和深拷贝

发布时间:2019-06-27 09:49:56编辑:auto阅读(1688)

    python中的赋值是按引用来传递的,如果不是赋值而是拷贝,那就需要用到copy模块了,这就不得不谈浅拷贝和深拷贝了。

     

    浅拷贝copy()

     

    1. #!/usr/bin/python 
    2.  
    3. import copy 
    4.  
    5. class MyClass: 
    6.     def __init__(self, name): 
    7.         self.name = name 
    8.     def __cmp__(self, other): 
    9.         return cmp(self.name, other.name) 
    10.      
    11. a = MyClass('a'
    12. my_list = [a] 
    13. dup = copy.copy(my_list) 
    14.  
    15. print '             my_list:', my_list 
    16. print '                 dup:', dup 
    17. print '      dup is my_list:', (dup is my_list) 
    18. print '      dup == my_list:', (dup == my_list) 
    19. print 'dup[0] is my_list[0]:', (dup[0is my_list[0]) 
    20. print 'dup[0] == my_list[0]:', (dup[0] == my_list[0]) 

    结果:

                 my_list: [<__main__.MyClass instance at 0x00BA5530>]

                     dup: [<__main__.MyClass instance at 0x00BA5530>]

          dup is my_list: False

          dup == my_list: True

    dup[0] is my_list[0]: True

    dup[0] == my_list[0]: True

     

    深拷贝deepcopy()

    1. #!/usr/bin/python 
    2.  
    3. import copy 
    4.  
    5. class MyClass: 
    6.     def __init__(self, name): 
    7.         self.name = name 
    8.     def __cmp__(self, other): 
    9.         return cmp(self.name, other.name) 
    10.      
    11. a = MyClass('a'
    12. my_list = [a] 
    13. dup = copy.deepcopy(my_list) 
    14.  
    15. print '             my_list:', my_list 
    16. print '                 dup:', dup 
    17. print '      dup is my_list:', (dup is my_list) 
    18. print '      dup == my_list:', (dup == my_list) 
    19. print 'dup[0] is my_list[0]:', (dup[0is my_list[0]) 
    20. print 'dup[0] == my_list[0]:', (dup[0] == my_list[0]) 

    结果:

                 my_list: [<__main__.MyClass instance at 0x00BA5530>]

                     dup: [<__main__.MyClass instance at 0x00BA5620>]

          dup is my_list: False

          dup == my_list: True

    dup[0] is my_list[0]: False

    dup[0] == my_list[0]: True

     

    浅拷贝和深拷贝都是copy,表面好像也看不出什么区别来。

     

    1. import copy 
    2.  
    3. list1 = ['a','b','c'
    4. list2 = copy.copy(list1) 
    5. list3 = copy.deepcopy(list1) 
    6.  
    7. print list1 
    8. print list2 
    9. print list3 

    结果:

    ['a', 'b', 'c']

    ['a', 'b', 'c']

    ['a', 'b', 'c']

     

     

    如果只是简单的拷贝一下没有后续操作,那么随便拷贝都行。浅拷贝和深拷贝都是为后续操作而区分的。

    1. import copy 
    2.  
    3. list1 = ['a','b','c',['d','e']] 
    4. list2 = copy.copy(list1) 
    5. list3 = copy.deepcopy(list1) 
    6.  
    7. list1.append('f'
    8. list1[3].append('x'
    9.  
    10. print list1 
    11. print list2 
    12. print list3 
    13.  
    14. list4 = list1 
    15. print list4 

    结果:

     

    ['a', 'b', 'c', ['d', 'e', 'x'], 'f']

    ['a', 'b', 'c', ['d', 'e', 'x']]

    ['a', 'b', 'c', ['d', 'e']]

    ['a', 'b', 'c', ['d', 'e', 'x'], 'f']

     

    从这就能看出来,就以列表为例,如果浅拷贝,那么系统就新建一个列表,它的每个元素都指向原来列表的每个元素(就像C语言里的指针数组),输出的时候就把它各元素指向的母体元素内容显示出来,所以list1追加了f元素以后list2并没有显示,因为list2里并没有指向这个新元素的元素。但是追加了x以后显示出来了,因为x属于list1的第三个元素的一部分,在list2有对应的指向,所以就显示出来了。对于深拷贝来说没有任何改变,因为深拷贝是新建一个列表,把原列表的内容原封不动拷过来,拷过来以后它和原列表一模一样,至于原列表后来做了什么改变根本不关它的事。形象理解就是浅拷贝是活的,深拷贝是死的。

     

关键字