Python3 深拷贝浅拷贝

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

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以及其内的子对象的变化互不影响。也可以理解为两个完全不相干的两个对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值