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

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

    拷贝:拷贝指的是拷贝原列表产生新的列表(id 是不同的)

    浅拷贝:

    list1 = ['egon', 'lxx', [1,2]]
    list3 = list1.copy() #浅拷贝
    

    什么是浅拷贝:

    ​ 是把原列表第一层的内存地址不加区分(可变和不可变元素)完全 copy 一份给新列表

    list1=[
        'egon',
        'lxx',
        [1, 2]
    ]
    list3 = list1.copy()
    print(list3) #['egon', 'lxx', [1, 2]]
    print(id(list1)) #4328662792
    print(id(list3)) #4328845576
    print(list3[0], list3[1], list3[2])
    print(id(list3[0]), id(list3[1]), id(list3[2]))
    '''
    不可变       不可变         可变   
    egon         lxx        [1, 2]
    4562892312 4564357336 4564371656
    '''
    list1[0] = 'EGON'
    list1[1] = 'LXX'
    list1[2][0] = 111
    list1[2][1] = 222
    print(list3[0], list3[1], list3[2])
    print(id(list3[0]), id(list3[1]), id(list3[2]))
    '''
    egon        lxx       [111, 222]
    4562892312 4564357336 4564371656
    '''
    

    image-20200309170144443

    总结:

    1、对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表

    2、对于不可变类型时,会改变可变类型中包含元素的值,但元素的内存地址不变

    也就是说,浅拷贝只是拷贝的原列表的第一层,其内部每个元素还是指向同一个内存地址。

    深拷贝:

    ​ 深拷贝是对每一层都拷贝,对可变及不可变类型都加以区分

    import copy
    list1=[
        'egon',
        'lxx',
        [1,2]
    ]
    
    list3 = copy.deepcopy(list1)
    print(id(list1[0]),id(list1[1]),id(list1[2]))
    print(id(list3[0]),id(list3[1]),id(list3[2]))
    '''
    4519556632 4521021656 4520863496
    4519556632 4521021656 4521049096
    '''
    list1[0]='EGON'
    list1[1]='LXX'
    list1[2][0]=111
    list1[2][1]=222
    # print(list1)
    print(list3) #['egon', 'lxx', [1, 2]]
    
    

    深拷贝

    总结:

    深拷贝是区分可变类型与不可变类型的copy机制

    也就是说深拷贝是完全拷贝原列表的所有层

    如果想要针对改操作,完全独立开两个列表,用 copy.deepcopy()

  • 相关阅读:
    Linux新手入门:通过chmod改变文件权限--转
    一个非常好的性格切割问题
    Weka算法Classifier-tree-J48源代码分析(一个)基本数据结构和算法
    百度地图3.1课程—检索演示
    JAVA在IO流量汇总
    crm2011i创建nt类型字段
    学习vi和vim编辑(3):一个简单的文本编辑器(2)
    禹洲:我们这一代人的困惑
    D其他项目打电话AL工程EF Model
    HDU 2289 Cup(可以二分法,但是除了它的一半?)
  • 原文地址:https://www.cnblogs.com/xy-han/p/12450303.html
Copyright © 2011-2022 走看看