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

    # 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
    

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

  • 相关阅读:
    WebView.简单使用_ZC代码
    WebView.简单使用_资料
    APK.错误解决_Theme.AppCompat.Light相关
    USB调试.红米Note4X
    Android_连接数据库_资料收集
    APK签名_ZC
    APK签名_资料
    ubuntu系统中代替windows系统中onenote软件--basket note pads
    firefox浏览器设置新页面后激活
    oracle 写declare例子
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/12449223.html
Copyright © 2011-2022 走看看