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

     

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

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

  • 相关阅读:
    Swing中GridBagLayout布局的使用
    Android下Slidingmenu和actionbarsherlock的使用
    Swing基础知识
    Android下的ActionBar
    android下ADT的更新
    spark插件入门完整版本
    IOS开发准备 资料集锦
    Java调用本地浏览器
    Android源码在线查看网址
    Android中ProgressBar
  • 原文地址:https://www.cnblogs.com/lixiaoliuer/p/6094698.html
Copyright © 2011-2022 走看看