• python 拷贝 深拷贝 浅拷贝 赋值


    t = [1,["a","b"]]
    
    t_bak = t
    t_cop = copy.copy(t)
    t_deep = copy.deepcopy(t)
    
    print("id(t)---  "+str(id(t))+"    id(t[1])   " +str(id(t[1])) +"    id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
    print("id(t_bak)---  "+str(id(t_bak))+"    id(t_bak[1])   " +str(id(t_bak[1])) +"   id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
    print("id(t_copy)---  "+str(id(t_cop))+"    id(t_cop[1])   " +str(id(t_cop[1])) +"    id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
    print("id(t_deep)---  "+str(id(t_deep))+"    id(t_deep[1])   " +str(id(t_deep[1])) +"    id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
    
    id(t)---  140706556438648    id(t[1])   140706556410336    id(t[1][1] 也就是 内部列表中的第二个元素140706557474336
    id(t_bak)---  140706556438648    id(t_bak[1])   140706556410336   id(t_bak[1][1] 也就是 内部列表中的第二个元素140706557474336
    id(t_copy)---  140706534860560    id(t_cop[1])   140706556410336    id(t_cop[1][1] 也就是 内部列表中的第二个元素140706557474336
    id(t_deep)---  140706556438576    id(t_deep[1])   140706556439656    id(t_deep[1][1] 也就是 内部列表中的第二个元素140706557474336
    

    可以看到, tt_bak 这种直接赋值的操作,其实指向的是同一个对象,无论是第一层,还是内部嵌套的元素

    tt_cop 这种copy操作,第一层的id已经不一样了,说明他们创建了新的对象,但是内部嵌套的元素还是一致的,说明给他们内部嵌套指向的是同一个对象。
    再说 tt_deep 这种deepcopy 深拷贝操作,发现,第一层已经不一样了,说明创建了新的对象,但是内部嵌套的元素还是一样的

    修改t_bak(1)

    t_bak.append("3")
    print(t) #[1, ['a', 'b'], '3']
    print(t_bak)#[1, ['a', 'b'], '3']
    print(t_cop)#[1, ['a', 'b']]
    print(t_deep)#[1, ['a', 'b']]
    
    print("id(t)---  "+str(id(t))+"    id(t[1])   " +str(id(t[1])) +"    id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
    print("id(t_bak)---  "+str(id(t_bak))+"    id(t_bak[1])   " +str(id(t_bak[1])) +"   id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
    print("id(t_copy)---  "+str(id(t_cop))+"    id(t_cop[1])   " +str(id(t_cop[1])) +"    id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
    print("id(t_deep)---  "+str(id(t_deep))+"    id(t_deep[1])   " +str(id(t_deep[1])) +"    id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
    
    
    id(t)---  139789718802088    id(t[1])   139789718801728    id(t[1][1] 也就是 内部列表中的第二个元素139789719836192
    id(t_bak)---  139789718802088    id(t_bak[1])   139789718801728   id(t_bak[1][1] 也就是 内部列表中的第二个元素139789719836192
    id(t_copy)---  139789697222416    id(t_cop[1])   139789718801728    id(t_cop[1][1] 也就是 内部列表中的第二个元素139789719836192
    id(t_deep)---  139789718802232    id(t_deep[1])   139789718802376    id(t_deep[1][1] 也就是 内部列表中的第二个元素139789719836192
    

    修改 t_bak(2)

    t_bak[1][1]='c'
    print(t) #[1, ['a', 'c'],]
    print(t_bak)#[1, ['a', 'c']]
    print(t_cop)#[1, ['a', 'c']]
    print(t_deep)#[1, ['a', 'b']]
    
    id(t)---  140085180813112    id(t[1])   140085180812968    id(t[1][1] 也就是 内部列表中的第二个元素140085181848632
    id(t_bak)---  140085180813112    id(t_bak[1])   140085180812968   id(t_bak[1][1] 也就是 内部列表中的第二个元素140085181848632
    id(t_copy)---  140085159233296    id(t_cop[1])   140085180812968    id(t_cop[1][1] 也就是 内部列表中的第二个元素140085181848632
    id(t_deep)---  140085180813040    id(t_deep[1])   140085180812536    id(t_deep[1][1] 也就是 内部列表中的第二个元素140085181847072
    

    这也证明了上述:
    浅拷贝创建了一个新的对象,但是内部嵌套的元素仍然和原对象引用的是同一个。
    深拷贝,无论内外都重新复制了一份

    修改 t_cop

    
    t_cop.append(4)
    t_cop[1][1] = 'd'
    print(t) #[1, ['a', 'd']]
    print(t_bak)##[1, ['a', 'd']]
    print(t_cop)#[1, ['a', 'd'], 4]
    print(t_deep)#[1, ['a', 'b']]
    
    print("id(t)---  "+str(id(t))+"    id(t[1])   " +str(id(t[1])) +"    id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
    print("id(t_bak)---  "+str(id(t_bak))+"    id(t_bak[1])   " +str(id(t_bak[1])) +"   id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
    print("id(t_copy)---  "+str(id(t_cop))+"    id(t_cop[1])   " +str(id(t_cop[1])) +"    id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
    print("id(t_deep)---  "+str(id(t_deep))+"    id(t_deep[1])   " +str(id(t_deep[1])) +"    id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
    
    id(t)---  140596834620840    id(t[1])   140596834621920    id(t[1][1] 也就是 内部列表中的第二个元素140596835776312
    id(t_bak)---  140596834620840    id(t_bak[1])   140596834621920   id(t_bak[1][1] 也就是 内部列表中的第二个元素140596835776312
    id(t_copy)---  140596813072144    id(t_cop[1])   140596834621920    id(t_cop[1][1] 也就是 内部列表中的第二个元素140596835776312
    id(t_deep)---  140596834620912    id(t_deep[1])   140596834651312    id(t_deep[1][1] 也就是 内部列表中的第二个元素140596835685920
    

    修改 t_deep

    t_deep.append(5)
    t_deep[1][1] = 'e'
    
    print(t) #[1, ['a', 'b']]
    print(t_bak)#[1, ['a', 'b']]
    print(t_cop)#[1, ['a', 'b']]
    print(t_deep)#[1, ['a', 'e'], 5]
    
    print("id(t)---  "+str(id(t))+"    id(t[1])   " +str(id(t[1])) +"    id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
    print("id(t_bak)---  "+str(id(t_bak))+"    id(t_bak[1])   " +str(id(t_bak[1])) +"   id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
    print("id(t_copy)---  "+str(id(t_cop))+"    id(t_cop[1])   " +str(id(t_cop[1])) +"    id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
    print("id(t_deep)---  "+str(id(t_deep))+"    id(t_deep[1])   " +str(id(t_deep[1])) +"    id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
    
    id(t)---  140579373325560    id(t[1])   140579373295088    id(t[1][1] 也就是 内部列表中的第二个元素140579374360096
    id(t_bak)---  140579373325560    id(t_bak[1])   140579373295088   id(t_bak[1][1] 也就是 内部列表中的第二个元素140579374360096
    id(t_copy)---  140579351746320    id(t_cop[1])   140579373295088    id(t_cop[1][1] 也就是 内部列表中的第二个元素140579374360096
    id(t_deep)---  140579373325488    id(t_deep[1])   140579373326136    id(t_deep[1][1] 也就是 内部列表中的第二个元素140579374451928
    
  • 相关阅读:
    4月份学习计划
    windows下下载安装python、 pip、nose
    Windows下怎么搭建Python+Selenium的自动化环境
    pthon之异常、文件练习题
    python 元组 字符串 字典 列表嵌套练习题1
    硬件访问服务AIDL JNI 方式
    Android 加载图片优化(二) LruCache DiskLruCache
    Android 加载图片优化(一)
    ubuntu 下 4412烧写SuperBoot
    metro WCF
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7831189.html
Copyright © 2020-2023  润新知