• 深拷贝浅拷贝


    一、赋值运算

    l1 = [1,2,3,['a','b']]
    l2 = l1
    l1[0] = 111
    print(l1)  # [111, 2, 3, ['a', 'b']]
    print(l2)  # [111, 2, 3, ['a', 'b']]
    
    l1[3][0] = 'hello'
    print(l1)  # [111, 2, 3, ['hello', 'b']]
    print(l2)  # [111, 2, 3, ['hello', 'b']]
    #所以,对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的

    二、浅拷贝 copy

    l1 = [1,2,3]
    l2 = l1.copy() # copy,在内存中产生了新的地址
    print(l1,l2)   # [1, 2, 3] [1, 2, 3]
    print(id(l1),id(l2))   # 2137678556040 2137678553608
    l2.append('a')
    print(l1,l2)   # [1, 2, 3] [1, 2, 3, 'a']
    
    l3 = [1,2,[4,5,6],3]
    l4 = l3.copy()
    print(l3,id(l3))  # [1, 2, [4, 5, 6], 3] 2535910547976
    print(l4,id(l4))  # [1, 2, [4, 5, 6], 3] 2535910565192
    l3.append('a')
    print(l3,l4)  # [1, 2, [4, 5, 6], 3, 'a']   [1, 2, [4, 5, 6], 3]
    l3[2].append('a')
    print(l3,l4)  # [1, 2, [4, 5, 6, 'a'], 3]   [1, 2, [4, 5, 6, 'a'], 3]
    print(id(l3[2]),id(l4[2]))  # 2535910550408 2535910550408
    # 对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,
    # 指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

      三、深拷贝 deepcopy

    import  copy
    l1 = [1,2,[4,5,6],3]
    l2 = copy.deepcopy(l1)
    print(l1,id(l1))  # [1, 2, [4, 5, 6], 3] 2773191650376
    print(l2,id(l2))  # [1, 2, [4, 5, 6], 3] 2773191650888
    l1[2].append('a')
    print(l1,l2)  # [1, 2, [4, 5, 6, 'a'], 3]   [1, 2, [4, 5, 6], 3]
    # 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
  • 相关阅读:
    【程序员的自我修养】读书笔记
    Notepad++ 正则表达式
    【BI】商务智能
    【BI】OLTP与OLAP的区别
    【Linux】条件判断eq、ne、gt、lt、ge、le
    【shell】shell基础脚本合集
    capture同focus
    c++101rule
    老生常谈,正确使用memset
    C语言的数组名和对数组名取地址
  • 原文地址:https://www.cnblogs.com/huangjm263/p/8086420.html
Copyright © 2020-2023  润新知