zoukankan      html  css  js  c++  java
  • 学习python -- 第016天 浅拷贝和深拷贝

    深拷贝和浅拷贝需要注意的地方就是:可变元素的拷贝

    在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别 。

    浅拷贝

    使用copy模块里面的copy方法实现。

    改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;

    改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

     1 #
     2 # @author:浊浪
     3 # @version:0.1
     4 # @time: 2021/4/19 9:35
     5 # 
     6 import copy
     7 #定义一个列表,其中第一个元素是可变类型。
     8 list1 = [[1,2], 'fei', 66];
     9 #进行浅copy
    10 list2 = copy.copy(list1);
    11 
    12 #对象地址是否相同。
    13 print(id(list1));
    14 print(id(list2));
    15 #结果:不同
    16 46177816
    17 46177936
    18 
    19 #第一个元素地址是否相同。
    20 print(id(list1[0]));
    21 print(id(list2[0]));
    22 #结果:相同
    23 46240432
    24 46240432
    25 
    26 #第二个元素地址是否相同。
    27 print(id(list1[1]));
    28 print(id(list2[1]));
    29 #结果:相同
    30 45547328
    31 45547328
    32 
    33 
    34 #改变第一个值,查看复制对象变化。
    35 list1[0][0] = 2;
    36 print(list2);
    37 #结果:复制对象发生变化
    38 [[2, 2], 'fei', 66]
    39 
    40 #改变第二个值,查看复制对象变化。
    41 list1[1] = 'ge';
    42 print(list2);
    43 #结果:复制对象没发生变了
    44 [[2, 2], 'fei', 66]

    深拷贝

    copy模块里面的deepcopy方法实现。

    深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。

    原始对象和拷贝对象所有的可变元素地址都不一样了。

     1 #
     2 # @author:浊浪
     3 # @version:0.1
     4 # @time: 2021/4/19 9:36
     5 # 
     6 import copy
     7 #定义一个列表,其中第一个元素是可变类型。
     8 list1 = [[1,2], 'fei', 66];
     9 #进行深copy
    10 list2 = copy.deepcopy(list1);
    11 
    12 #对象地址是否相同。
    13 print(id(list1));
    14 print(id(list2));
    15 #结果:不同
    16 46177816
    17 46177936
    18 
    19 #第一个元素地址是否相同。
    20 print(id(list1[0]));
    21 print(id(list2[0]));
    22 #结果:不同
    23 49123856
    24 49588784
    25 
    26 #第二个元素地址是否相同。
    27 print(id(list1[1]));
    28 print(id(list2[1]));
    29 #结果:相同
    30 45547328
    31 45547328
    32 
    33 #改变第一个值,查看复制对象变化。
    34 list1[0][0] = 2;
    35 print(list2);
    36 #结果:复制对象没发生变了
    37 [[1, 2], 'fei', 66]
    38 
    39 #改变第二个值,查看复制对象变化。
    40 list1[1] = 'ge';
    41 print(list2);
    42 #结果:复制对象没发生变了
    43 [[1, 2], 'fei', 66]

    参考:https://mp.weixin.qq.com/s?src=11&timestamp=1618795789&ver=3017&signature=ON7jaX30DZUR5dcPerCwhirHixtLA5ZXPFrXDm86cQDc-f2qx3lbn4QAh1dPr*S9JZTbHJVcf9c4wbChHxsv2W0ub52NJtDewYLHgPsH2PJFDnuC*1eruoNl8u5fWTlN&new=1

    认清现实,放弃幻想。 细节决定成败,心态放好,认真学习与工作。
  • 相关阅读:
    MySQL数据库事务隔离级别(Transaction Isolation Level)
    getParameter() getInputStream()和getReader() 区别
    Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
    解决count distinct多个字段的方法
    表的连接查询
    使用Nexus搭建Maven代理仓库
    来测试下你的JAVA编程能力
    JAVA编程能力提升学习图
    负载均衡各个算法JAVA诠释版
    从零开始学领域驱动设计(二)
  • 原文地址:https://www.cnblogs.com/jyf2018/p/14675567.html
Copyright © 2011-2022 走看看