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]))

     

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

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

  • 相关阅读:
    laravel 多对多 belonsToMany
    C语言union关键字
    FW:程序在内存的划分(转)
    操作系统:进程/线程同步的方式和机制,进程间通信
    FW:考查嵌入式C开发人员的最好的16道题(转)
    操作系统死锁产生、条件、和解锁
    100层高楼摔2个鸡蛋的问题?
    【转】看完这个你的位运算学得就差不多了
    函数递归的几个例子
    如何查看服务器(linux系统)当前的负载信息(转)
  • 原文地址:https://www.cnblogs.com/lixiaoliuer/p/6094698.html
Copyright © 2011-2022 走看看