• 深浅拷贝


    # list1=[
    #     'egon',
    #     'lxx',
    #     [1,2]
    # ]
    
    # 1、二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址
    # list2=list1 # 这不叫copy
    # list1[0]='EGON'
    # print(list2)
    

    普通的赋值并不能算拷贝,现实中需要的是两个完全独立的列表。

    如何拷贝列表?

    1.浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表

    list1=['egon','lxx',[1,2]]
    list3=list1.copy()
    print(id(list1))
    print(id(list3))
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    
    ['egon', 'lxx', [1, 2]]
    31891840
    31990656
    5891376 5891120 5892096
    5891376 5891120 5892096
    ['egon', 'lxx', [1, 2]]
    
    list1=['egon','lxx',[1,2]]
    list3=list1.copy()
    print(list3)
    list1[0]='EGON'
    list1[1]='LXX'
    list1[2]=123
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    
    ['egon', 'lxx', [1, 2]]
    5104560 5105008 8791449064928
    5105264 5104688 5105664
    
    

    对于不可变类型的赋值,都是产生了新值,让愿列表的索引指向新的内存地址,并不会英雄新列表

    list1=['egon','lxx',[1,2]]
    list3=list1.copy()
    print(list3)
    list1[0]='EGON'
    list1[1]='LXX'
    list1[2][0]=111
    list1[2][1]=222
    
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    

    对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,即原列表的索引仍然指向原来的内存地址,于是新列表也跟着一起受影响

    通过以上可以看出,要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy

    2.深拷贝

    import copy
    list1=[ 'egon','lxx', [1,2]]
    list3=copy.deepcopy(list1)
    print(id(list1))
    print(id(list3))
    print(list3)
    
    #          不可变        不可变        可变
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    print(id(list1[2][0]),id(list1[2][1]))
    print(id(list3[2][0]),id(list3[2][1]))
    
    
    40906176
    40904000
    ['egon', 'lxx', [1, 2]]
    6939952 6939696 41105664
    6939952 6939696 41105984
    8791447357088 8791447357120
    8791447357088 8791447357120
    

    深拷贝中把可变类型的内存地址进行了改变,而其内部的列表却没有

    import copy
    list1=[ 'egon','lxx', [1,2]]
    list3=copy.deepcopy(list1)
    
    list1[0]='EGON'
    list1[1]='LXX'
    list1[2][0]=111
    list1[2][1]=222
    #          不可变        不可变        可变
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    
    38855600 40641072 40843520
    38855984 38856304 40843840
    8791447360608 8791447364160
    8791447357088 8791447357120
    

    从这里可以看出,深拷贝使两个列表变成了完全独立的列表

  • 相关阅读:
    升级python
    python内置函数整理
    import 搜索路径
    webpy 解决中文出现UnicodeDecodeError: 'ascii' codec can't decode byte 问题
    未预期的符号 `$'{ '' 附近有语法错误
    python引入模块时import与from ... import的区别
    "Native table 'performance_schema'.'session_variables' has the wrong structure") [SQL: "SHOW VARIABLES LIKE 'sql_mode'"]
    git命令
    Redis简介
    MongoDB基本操作
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/12449223.html
Copyright © 2020-2023  润新知