• Python中的深浅拷贝


    1.什么是深浅拷贝?

    python中一切皆对象,python中的数字、字符串、元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的内存空间是可以被修改的。

    下面我们定义一个列表:

    list=[1,2,3,4,5]

    list1=list

    list[0]=6

    >>>list

    [6,2,3,4,5]

    >>>list1

    [6,2,3,4,5]

    如果我们只想改变list,问题就出现了。

    赋值操作 list1 = list,是浅拷贝,当list的值改变的时候,list1的值跟着改变。

    2.用for和[:]实现浅拷贝

    list = [1,2,3,4,5]  

    list2= [ i for i in list]  //list2=list[:]

    list2[-1]=0

    >>> list

    >>> list2

    [1, 2, 3, 4, 5] 

    [1, 2, 3, 4, 0] 

    上面的例子,用for循环生成新的list2对象或者[:]切片赋值得到的list2,当改变list2的值时,list的值没有跟着改变,这就是深拷贝吗?且继续往下看:

    3.

    list = [1, 2, 3, [1,2009] ]  

    list3 = [ i for i in list]  //list2=list[:]

    list3[-1].append(2009)

    >>> list 

    >>> list3 

    [1, 2, 3, [1, 2009, 2009]]

    [1, 2, 3, [1, 2009, 2009]]  

    3 和  2难道有矛盾?不。

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

    4

     for i in list:  

     print id(i)       

    3630168  

    3630156  

    3630144  

    46784880  

    for i in list3:  

    print id(i)

    3630168  

    3630156  

    3630144  

    46784880 

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

    5.

    import copy  

    list= [1, 2, 3, [1,2009] ]  

    list5 = copy.deepcopy(list)  

    >>> list 

    [1, 2, 3, [1, 2009]]  

    >>> list5

    [1, 2, 3, [1, 2009]]  

     list5[-1].append(2009)  

    >>> list5

    [1, 2, 3, [1, 2009, 2009]]  

    >>> list  

    [1, 2, 3, [1, 2009]]  

    6.总结:

    浅拷贝不会拷贝数据中的子对象。

    例如:for ,切片浅拷贝,impord copy   copy.copy

    深拷贝会拷贝数据中的子对象

    例如:impord   copy.deepcopy

     

  • 相关阅读:
    OnEraseBkgnd、OnPaint与画面重绘
    .编译ADO类DLL时报错的解决方案
    VC列表框样式
    Codeforces 131D. Subway 寻找环树的最短路径
    Codeforces 103B. Cthulhu 寻找奈亚子
    Codeforces 246D. Colorful Graph
    Codeforces 278C. Learning Languages 图的遍历
    Codeforces 217A. Ice Skating 搜索
    Codeforces 107A. Dorm Water Supply 搜图
    Codeforces 263 D. Cycle in Graph 环
  • 原文地址:https://www.cnblogs.com/rourou1/p/6085444.html
Copyright © 2020-2023  润新知