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

    一、赋值运算

    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来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/huangjm263/p/8086420.html
Copyright © 2011-2022 走看看