• (七)深浅拷贝


    一、= 赋值

          =是一个运算符,表示把=右边的值,赋值给左边。其实,这个赋值过程,只是把,右边值在内存中的地址,赋值给了左边。代码支持:

    lst1 = ['a', 'b', [1, 2]]
    lst2 = lst1
    print(id(lst1),id(lst2))
    lst1.append('c')
    print(lst1)
    print(lst2)
    结果:
    997818360456 997818360456
    ['a', 'b', [1, 2], 'c']
    ['a', 'b', [1, 2], 'c']
    997818362120 997818362120
    ['a', 'b', [1, 2, 3], 'c']
    ['a', 'b', [1, 2, 3], 'c']
    

         可以看出,lst2lst1的所有值都得到了。上一张图,帮助理解。

                                    

    二、深浅拷⻉

    1. 浅拷贝

        谈到浅拷贝,就会出现一个方法---copy(),这个方法就是把对象进行浅拷贝的。

        适用于list列表,set集合,dict字典,其他数据,没有此方法。代码展示一下,copy前后的结果。

     

    lst1 = ['a', 'b', [1, 2]]
    lst2 = lst1.copy()
    lst1[2].append(3)
    lst1.append('c')
    print(id(lst1))
    print(id(lst2))
    
    print(id(lst1[2]))
    print(id(lst2[2]))
    
    print(lst1)
    print(lst2)
    结果:
    219912462984
    219912465352
    474036693256
    474036693256
    ['a', 'b', [1, 2, 3], 'c']
    ['a', 'b', [1, 2, 3]]
    

           由上面程序输出的结果可以得到一个结论,复制后,lst2lst1不一样了,拥有了自己的内存空间,地址是:219912465352。但是[1,2],这个列表中的元素的地址却被复制到lst2中了,所以在结尾追加3时,lst2中也打印出3。由地址,也可以看出,两者是一样的地址。

          画了一张图,如下:

    1. 深度拷贝(深度克隆,原型模式)

               深度拷贝,使用与几乎所有数据类型。会把所有的内容进行拷贝,包括第二层,第三层等。看代码说话:

    import copy
    lst1 = ['a', 'b', [1, 2]]
    lst2 = copy.deepcopy(lst1)
    print(id(lst1), id(lst2))
    print(id(lst1[2]), id(lst2[2]))
    print(lst2)
    print(lst1)
    lst1.append('c')
    lst1[2].append(3)
    print(lst2)
    print(lst1)
    结果:
    876803976200 876805465224
    876803976136 876805465416
    ['a', 'b', [1, 2]]
    ['a', 'b', [1, 2]]
    ['a', 'b', [1, 2]]
    ['a', 'b', [1, 2, 3], 'c']
    

      使用深度拷贝时,需要导包,import copy。可以看出lst1lst2在内存中的地址不一样了,而且,里面的元素[1,2],列表在内存中的地址也不一样了。因此,无论后面lst1怎么追加数据,都不会影响到lst2。可以通过下图,再次理解一下。

     

  • 相关阅读:
    关于DB2 ORACLE MYSQL 数据库 where字句执行顺序问题
    关于图片上传的一些问题
    集合、迭代器的一些总结
    关于使用Echart记录
    DB2序列的使用
    (转载)判断浏览器类型是否IE及版本问题
    SQL中 IS NULL 和IS NOT NULL
    JS 中substr 和 substring
    (转载)身份证验证
    Echars 自适应浏览器大小
  • 原文地址:https://www.cnblogs.com/asia-yang/p/10066070.html
Copyright © 2020-2023  润新知