zoukankan      html  css  js  c++  java
  • 深浅拷贝

    可变对象-不可变对象

    在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字

    在Python中可变对象是指:可以修改的对象,包括:列表、字典

    上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。

    1. >>> L1 = [2,3,4]      #L1变量指向的是一个可变对象:列表  
    2. >>> L2 = L1           #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]  
    3. >>> L1[0] = 200       #因为列表可变,改变L1中第一个元素的值  
    4. >>> L1; L2            #改变后,L1,L2同时改变,因为对象本身值变了  
    5. [200, 3, 4]  
    6. [200, 3, 4]  

    如果不想改变列表L2的值,有两种方法:切片  copy模块

    1. >>> L1 = [2,3,4]   
    2. >>> L2 = L1  
    3. >>> id(L1);id(L2)     #共享引用一个可变对象  
    4. 45811784L  
    5. 45811784L  
    6. >>> L2 = L1[:]        #切片操作  
    7. >>> id(L1);id(L2)     #切片后,对象就不一样了  
    8. 45811784L  
    9. 45806920L  
    10. >>> L1[0] = 200  
    11. >>> L1;L2             #L1发生改变,L2没有变化  
    12. [200, 3, 4]  
    13. [2,   3, 4]  

    【拷贝】

    1. 切片技术应用于所有的序列,包括:列表、字符串、元祖 

       >>>但切片不能应用于字典。对字典只能使用D.copy()方法或D.deepcopy()方法.

    2. 深浅拷贝,即可用于序列,也可用于字典

       >>> import copy

       >>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

       >>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

    • 如果字典只有顶级对象:

    • 如果字典中嵌套对象:

    【结论】

    • 深浅拷贝都是对源对象的复制,占用不同的内存空间
    • 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
    • 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
    • 序列对象的切片其实是浅拷贝,即只拷贝顶级的对象
  • 相关阅读:
    [WWF]相关资料整理
    [CSharp]经常遇到字符编码转换的问题
    [BizTalk]BizTalk Server 2004的监控和管理
    [Linux]删除目录
    [BizTalk]好用的BizTalk管理工具
    [JWF]使用脚本访问ActiveDirectory(一)ADODB
    [BizTalk][Why]持久化数据库的状态时出现异常
    [BizTalk]关于BizTalk中的命名规则
    FTP连接
    [导入]跟踪BTSWebSvcWiz.exe的执行过程
  • 原文地址:https://www.cnblogs.com/yifugui/p/8193605.html
Copyright © 2011-2022 走看看