• 关于深浅拷贝的测试


    拷贝也就是复制,是为了对一个对象的备份使用,python中拷贝分为深拷贝和浅拷贝

    ==深拷贝== 深拷贝是递归的方式对对象的所有层次的拷贝 简单来说就是将一个对象完整的拷贝下来,包括内部构造的列表等等

    ==浅拷贝== 浅拷贝是对拷贝对象的顶层拷贝,即只拷贝了引用,不拷贝内容 简单来说,浅拷贝就是只拷贝外壳,对于内部的变化不做要求,所以原内容改变,会影响到拷贝的结果

    ##### 浅拷贝:copy.copy:只拷贝一层,如果是列表存列表,对列表中的列表改变也会影响拷贝列表
    ##### 深拷贝:copy.deepcopy: 拷贝所有,从内到外,在内存中重新开辟一个空间存储拷贝的内容,彼此不再相互影响
    ```
    import copy

    (一)
    ls = ['a','b','c']
    # 浅 拷贝的列表与原列表的地址不同,是在内存空间新开辟的空间进行的存储
    ls1 = copy.copy(ls)
    print(ls1,id(ls1),id(ls))

    # 深 拷贝的列表与原列表地址相同,即使用的是同一个对象,但是指向了不同的变量
    ls2 = copy.deepcopy(ls)
    print(ls2,id(ls2),id(ls))


    (二)
    c = [a,b]
    d = copy.deepcopy(c)
    e = copy.copy(c)
    print(id(c),id(d),id(e))
    ### 48622048 48622008 48621928 ###
    # 此时分别进行了深拷贝与浅拷贝,但是三者的地址都不同

    上面两个例子,我们可以假设深拷贝对于递归内容要求是全部不可变,不可变就不会改变地址,有可变元素就会改变原始的地址
    下面是测试:

    (三)
    ls = [(1, 2, 3), '8']
    ls1 = copy.copy(ls)
    ls2 = copy.deepcopy(ls)

    print(id(ls),id(ls1),id(ls2))
    ### 47769080 47769320 47770080 ###

    ls = [[1, 2, 3], '8']
    ls1 = copy.copy(ls)
    ls2 = copy.deepcopy(ls)

    print(id(ls),id(ls1),id(ls2))
    ### 47244992 47245752 47245712 ###

    观察上面两个列表的拷贝情况,当元素不可变时,深拷贝就会使用源地址
    ```

    #### 需要注意的是:两者拷贝出来得到的对象都可以进行使用且不会影响原来的对象,但是当原对象改变时,浅拷贝会随之改变,深拷贝则不会

  • 相关阅读:
    七七四十九劫,九九八十一难
    Android中用layer-list编写阴影效果
    Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
    Effective C++ 24,25
    windows系统port监听
    线程同步辅助类——Exchanger
    C/C++中constkeyword
    【COCOS2DX-游戏开发之三三】TMX边界控制与小窗体内预览TMX
    IDFA的值什么时候会发生改变
    hadoop(六)
  • 原文地址:https://www.cnblogs.com/Zhao01/p/10083283.html
Copyright © 2020-2023  润新知