zoukankan      html  css  js  c++  java
  • python的深拷贝和浅拷贝

    数字和字符串

    数字和字符串中的内存都指向同一个地址,所以深拷贝和浅拷贝对于他们而言都是无意义的

    import copy
    
    a = 123                #赋值
    
    print(id(a))           #输出存储变量的地址
    
    b = a
    
    print(id(b))
    
    b = copy.copy(a)       #浅拷贝
    
    print(id(b))
    
    c = copy.deepcopy(a)  #深拷贝
    
    print(id(c))
    

     

     浅拷贝

    对于字典 元组 和列表来说,进行浅拷贝和深拷贝时,内存的地址是不同的

    浅拷贝只会拷贝内存中的第一层数据

    import copy
    
    dic = {'key1':123,'key2':[123,456]}            #创建一个字典嵌套列表
    
    print(id(dic['key1']))
    print(id(dic['key2']))
    print(id(dic['key2'][0]))                      #打印列表中的地址
    
    print("
    ")
    
    new_dic = copy.copy(dic)                       #使用浅拷贝赋值 
    
    print("*",id(new_dic['key1']))
    print("*",id(new_dic['key2']))
    print("*",id(new_dic['key2'][0]))


    发现内存中地址的值都是完全相同

     深拷贝

    而对于深拷贝来说将会把所有数据重新创建

    import copy
    
    dic = {'key1':123,'key2':[123,456]}            #创建一个字典嵌套列表
    
    print(id(dic['key1']))
    print(id(dic['key2']))
    print(id(dic['key2'][0]))                      #打印列表中的地址
    
    print("
    ")
    
    new_dic = copy.deepcopy(dic)                       #使用深拷贝赋值 
    
    print("*",id(new_dic['key1']))
    print("*",id(new_dic['key2']))
    print("*",id(new_dic['key2'][0]))
    

     深拷贝的应用

    在浅拷贝中 当改变拷贝对象的值 被拷贝对象的值也会随之改变

    import copy
    
    dic = {'key1':123,'key2':[123,456]}            #创建一个字典嵌套列表
    
    
    print(dic['key2'][0])                          #打印列表中的地址
    
    print("
    ")
    
    new_dic = copy.deepcopy(dic)                       #使用浅拷贝赋值 
    
    new_dic['key2'][0] = 789                       #改变字典中列表的值
    
    print(dic['key2'][0])
    print((new_dic['key2'][0]))

    当不想改变被拷贝的值时 应该使用深拷贝

    import copy
    
    dic = {'key1':123,'key2':[123,456]}            #创建一个字典嵌套列表
    
    
    print(dic['key2'][0])                          #打印列表中的地址
    
    print("
    ")
    
    new_dic = copy.deepcopy(dic)                       #使用深拷贝赋值 
    
    new_dic['key2'][0] = 789                       #改变字典中列表的值
    
    print(dic['key2'][0])
    print((new_dic['key2'][0]))

     

     浅拷深拷贝深拷贝贝浅拷贝

    ---恢复内容结束---

  • 相关阅读:
    K折交叉验证
    浅谈python的第三方库——pandas(三)
    关于机器学习二分类问题的几个评估指标辨析
    浅谈python的第三方库——pandas(二)
    浅谈python的第三方库——pandas(一)
    【内核篇】Windows内核重要变量
    【逆向篇】分析一段简单的ShellCode——从TEB到函数地址获取
    【系统篇】从int 3探索Windows应用程序调试原理
    【编程篇】使用操作系统异常巧妙获取交叉链表的交点
    【灌水篇】为什么我们要拼搏北上广
  • 原文地址:https://www.cnblogs.com/lixiaoliuer/p/6094698.html
Copyright © 2011-2022 走看看