Python3 深拷贝浅拷贝

版权声明:本文为博主原创文章,转载需注明出处。 https://blog.csdn.net/AsynSpace/article/details/85246126

感觉对深拷贝浅拷贝有一点混淆。特地写了几行,方便自己查看一下他们的区别 

import copy


if __name__ == "__main__":
    str = "\nn={0}\taddr:{4}\na={1}\taddr:{5}\nb={2}\taddr:{6}\nc={3}\taddr:{7}\n"
    # 基数
    n = [100,101,[200,201]]
    # 直接相等赋值
    a = n
    # copy拷贝
    b = copy.copy(n)
    # deepcopy 拷贝
    c = copy.deepcopy(n)

    # 输出查看变化
    print("修改n前变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))

    # n追加后变化
    n.append(301)
    print("n追加后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))

    # n子节点追加后变化
    n[2].append(11)
    print("n子节点追加后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))

    # 改变n子节点内容后变化
    n[2] = [1111,1112]
    print("改变n子节点内容后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))

下面是运行结果: 

从结果可以看出

当直接赋值时,a和n的地址是一样的。而不管深拷贝和浅拷贝地址都是变化的。也就是说,列表n内数据改变时,列表a内的数据也会一起变化。而b,c不会。

当使用浅拷贝时,列表n内的子列表内数据变化时,b列表内的子列表也是一同变化的。也就是说,当使用浅拷贝时,拷贝深度仅为一个对象,而对象内的子对象的地址并不会改变。

当使用深拷贝时,列表c与列表n以及其内的子对象的变化互不影响。也可以理解为两个完全不相干的两个对象。

猜你喜欢

转载自blog.csdn.net/AsynSpace/article/details/85246126