• 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()

  • 相关阅读:
    浅谈c#中使用lock的是与非
    C#设计模式学习笔记单例模式
    ArrayList c.toArray might (incorrectly) not return Object[] (see 6260652)
    java.lang.Object 之 clone() 使用

    把以前的补齐 张
    String的方法 张
    随便写写 张
    集合框架 张
    java 张
  • 原文地址:https://www.cnblogs.com/xy-han/p/12450303.html
Copyright © 2020-2023  润新知