zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    算法提高 约数个数
    算法提高 第二大整数
    算法提高 逆序排列
    算法提高 c++_ch02_01
    算法提高 日期计算
    程序员教你设置密码
    fzu 2184 逆序数还原
    fzu 2146 Easy Game
    算法训练 区间k大数查询
    算法训练 最大最小公倍数
  • 原文地址:https://www.cnblogs.com/tonylaoshi/p/14313888.html
Copyright © 2011-2022 走看看