zoukankan      html  css  js  c++  java
  • 深浅拷贝的区别

    深浅拷贝的区别

    1.赋值运算

    l1 = [1,2,3,['tank','nick']]
    l2 = l1
    
    l1[0] = 111
    print(l1)  # [111, 2, 3, ['tank', 'nick']]
    print(l2)  # [111, 2, 3, ['tank', 'nick']]
    
    l1[3][0] = 'kevin'
    print(l1)  # [111, 2, 3, ['kevin', 'nick']]
    print(l2)  # [111, 2, 3, ['kevin', 'nick']]
    

    对于赋值运算的 l1 和l2 指向同一个内存地址 ,所以是完全一样的。数据共用。

    深浅拷贝针对的是可变类型的数据,对于不可变类型的数据,无论深浅拷贝,数据都是共用的,只要一个拷贝的值发生改变,另外一个不会受影响,没有任何的意义。

    2.浅拷贝

    l1 = [1,'tank',(1,2,3),[22,23]]
    
    l2 = l1.copy()
    l1[-1][1] = 10
    print(l1)  #[1, 'tank', (1, 2, 3), [22, 10]]
    print(l2)   #[1, 'tank', (1, 2, 3), [22, 10]]
    print(id(l1[1])) #2405832388824  
    print(id(l2[1])) #2405832388824
    print(id(l1))  #2526331895048
    print(id(l2))   #2526331994696
    print(id(l1[3]))  #2526331894856
    print(id(l2[3]))   #2526331894856
    print(id(l1[0]))   #1505198192
    print(id(l2[0]))   #1505198192
    

    对于浅拷贝,只是内存空间重新开辟了一块名称空间,但是被拷贝对象中的数据(无论可变还是不可变类型数据)都是共用的。对于拷贝对象的子元素是可变类型的,通过copy()或赋值得到的一个拷贝对象,被拷贝对象的子元素的值发送变化后,拷贝对象的值亦随之发生变化,反之亦然。

    3.深拷贝

    import copy
    l1 = [1,'tank',(1,2,3),[22,23]]
    
    l2 = copy.deepcopy(l1)
    l1[-1][1] = 10
    print(id(l1[1]))#2544575770840
    print(id(l2[1]))#2544575770840
    print(l1)#[1, 'tank', (1, 2, 3), [22, 10]]
    print(l2)#[1, 'tank', (1, 2, 3), [22, 23]]
    print(id(l1))#2544576199944
    print(id(l2))#2544576299592
    print(id(l1[3]))#2544576199752
    print(id(l2[3]))#2544576299528
    print(id(l1[0]))#1505198192
    print(id(l2[0])) # 1505198192
    

    对于深拷贝,内存空间中重新开辟一块新的名称空间,但是对于被拷贝对象中的可变类型的数据是重新创建的。通过deepcopy()得到的一个拷贝对象,被拷贝对象的的子元素发送变化后,并不影响拷贝对象的值,反之亦然。

  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/bs2019/p/12102493.html
Copyright © 2011-2022 走看看