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

posted @   November's  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示