• 理解python中的深拷贝与浅拷贝


     

    python中浅拷贝和深拷贝的区别如下:

    1. copy.copy 等价于切片[:]  浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。2个列表是不同的,但是子列表指向的仍然是同一个地址

    2. copy.deepcopy 深拷贝 拷贝对象及其子对象,确保2个列表不会影响对方,包括子列表

    import copy

    list1 = [1,2,3,4]

    print(id(list1))   #96011592

    list2 = list1.copy()

    print(list2)   #[1, 2, 3, 4]

    print(id(list2))  #95979528

    print(list1 is list2)  #False

    list3 = copy.deepcopy(list1)

    print(list3)   #[1, 2, 3, 4]

    print(id(list3))  #31271112

    print(list1 is list3)  #False

    因此,list1的改变不会影响到list2与list3。但是对于复杂一些的列表,例如嵌套列表、字典嵌套列表。浅拷贝与深拷贝两者便展示出完全不同的结果。

    import copy

     

    list1 = [1,2,3,4,[5,6]]

    print('list1的id:',id(list1))

    print('list1第4个元素的id:',id(list1[4]))

    #浅拷贝

    list2 = list1.copy()

    print(list2)

    print('list2的id:',id(list2))

    print('list2第4个元素的id:',id(list2[4]))

    #深拷贝

    list3 = copy.deepcopy(list1)

    print(list3)

    print('list3的id:',id(list3))

    print('list3第4个元素的id:',id(list3[4]))

    #改变list1中的元素

    list1[2] = 7

    list1[4][1] = 8

    print('list1:',list1)

    print('list2:',list2)

    print('list3:',list3)

    #运行结果

    list1的id: 95979528

    list1第4个元素的id: 96011592

    [1, 2, 3, 4, [5, 6]]

    list2的id: 40773832

    list2第4个元素的id: 96011592 #子对象的id值一样,表示浅拷贝没有拷贝对象,只是使用了列表的引用

     

    [1, 2, 3, 4, [5, 6]]

    list3的id: 96023432

    list3第4个元素的id: 40773704

     

    list1: [1, 2, 7, 4, [5, 8]]

    list2: [1, 2, 3, 4, [5, 8]] #父对象不变,子对象变

    list3: [1, 2, 3, 4, [5, 6]] #父子对象都不改变

  • 相关阅读:
    5.14每日一题题解
    5.13 每日一题题解
    5.12 每日一题题解
    5.11 每日一题题解
    5.10每日一题题解
    【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】
    【POJ1509】Glass Beads 【后缀自动机】
    【codevs3160】 LCS 【后缀自动机】
    【HDU4734】F(x) 【数位dp】
    【hdu6148】Valley Numer【数位dp模板题】
  • 原文地址:https://www.cnblogs.com/free-1124/p/13726563.html
Copyright © 2020-2023  润新知