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()得到的一个拷贝对象,被拷贝对象的的子元素发送变化后,并不影响拷贝对象的值,反之亦然。

  • 相关阅读:
    剑指offer-矩形覆盖
    剑指offer-变态跳台阶
    剑指offer-跳台阶
    剑指offer-斐波那契数列
    剑指offer-旋转数组的最小数字
    剑指offer-用俩个栈实现队列
    剑指offer-重建二叉树
    剑指offer-从尾到头打印链表
    http头
    mysql-8.0解压缩版安装配置完整过程
  • 原文地址:https://www.cnblogs.com/bs2019/p/12102493.html
Copyright © 2011-2022 走看看