• Python浅拷贝和深拷贝


    对于不可变数据类型:数字、字符串、元组,不论是浅拷贝还是深拷贝,都不会改变数据的地址。

    1.浅拷贝

    浅拷贝是顶层拷贝,拷贝顶层的可变数据类型。

    import copy
    
    #定义一个列表,其中第一个元素是可变类型。
    list1 = [[1,2], '33', 66];
    #进行浅copy
    list2 = copy.copy(list1);
    
    #对象地址是否相同。
    print(id(list1));
    print(id(list2));
    #结果:不同
    46177816
    46177936
    
    #第一个元素地址是否相同。
    print(id(list1[0]));
    print(id(list2[0]));
    #结果:相同
    46240432
    46240432
    
    #第二个元素地址是否相同。
    print(id(list1[1]));
    print(id(list2[1]));
    #结果:相同
    45547328
    45547328
    
    #改变第一个值,查看复制对象变化。
    list1[0][0] = 2;
    print(list2);
    #结果:复制对象发生变化
    [[2, 2], '33', 66]
    #改变第二个值,查看复制对象变化。
    list1[1] = '44';
    print(list2);
    #结果:复制对象没发生变了
    [[2, 2], '33', 66]
    

    2.深拷贝

    深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都不相同了。

    import copy
    
    #定义一个列表,其中第一个元素是可变类型。
    list1 = [[1,2], '33', 66];
    #进行深copy
    list2 = copy.deepcopy(list1);
    
    #对象地址是否相同。
    print(id(list1));
    print(id(list2));
    #结果:不同
    46177816
    46177936
    
    #第一个元素地址是否相同。
    print(id(list1[0]));
    print(id(list2[0]));
    #结果:不同
    49123856
    49588784
    
    #第二个元素地址是否相同。
    print(id(list1[1]));
    print(id(list2[1]));
    #结果:相同
    45547328
    45547328
    
    #改变第一个值,查看复制对象变化。
    list1[0][0] = 2;
    print(list2);
    #结果:复制对象没发生变了
    [[1, 2], '33', 66]
    #改变第二个值,查看复制对象变化。
    list1[1] = '44';
    print(list2);
    #结果:复制对象没发生变了
    [[1, 2], '33', 66]
    
  • 相关阅读:
    真的要努力了
    实事求是
    要努力了
    新征程,新目标
    真的要放弃了吗
    集中力量 主攻文科
    May the force be with me.
    记录级排名
    Android开发过程中git、repo、adb、grep等指令的使用
    Ubuntu环境变量设置
  • 原文地址:https://www.cnblogs.com/tonylaoshi/p/14313888.html
Copyright © 2020-2023  润新知