zoukankan      html  css  js  c++  java
  • python列表中的赋值与深浅拷贝

    首先创建一个列表

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

    一、赋值

    a=[[1,2,3],4,5,6]
    b=a
    a[0][1]='tom'
    print(a)
    print(b)
    结果:

    [[1, 'tom', 3], 4, 5, 6]
    [[1, 'tom', 3], 4, 5, 6]

    a=[[1,2,3],4,5,6]
    b=a
    b[0][1]='tom'
    print(a)
    print(b)
    结果:
    [[1, 'tom', 3], 4, 5, 6]
    [[1, 'tom', 3], 4, 5, 6]
    总结:赋值不管是对a列表改变还是对b列表改变,
    只要改变其中一个,另一个也会跟着变,这是因为a
    和b共用一块内存,没有创建新的内存,
    他们是相同的,他们指向同一个内存区域。

    二、浅拷贝 [:]or copy()

    a=[[1,2,3],4,5,6]
    b=a.copy()
    b[0][1]='tom'
    print(a)
    print(b)
    结果: 

        [[1, 'tom', 3], 4, 5, 6]
        [[1, 'tom', 3], 4, 5, 6]

    a=[[1,2,3],4,5,6]
    b=a.copy()
    a[0][1]='tom'
    print(a)
    print(b)
    结果:
    [[1, 'tom', 3], 4, 5, 6]
    [[1, 'tom', 3], 4, 5, 6]

    a=[[1,2,3],4,5,6]
    b=a.copy()
    b[1]='tom'
    print(a)
    print(b)
    结果:

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

    a=[[1,2,3],4,5,6]
    b=a.copy()
    a[1]='tom'
    print(a)
    print(b)
    结果:

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

    总结:从上面代码可以看出来浅拷贝是重新开辟一块内存,拷贝第一层数据,不拷贝内部子元素

    在本代码中,b列表重新开辟了一块内存放元素【b【0】,4,5,6】,也就是第一层内容,

    然后b【0】的位置指向了a【0】指向的内存位置

    三、深拷贝   使用copy函数

    重新开辟一块内存,存放拷贝列表的所有内容。a集合与b集合互不影响

    import copy
    a=[[1,2,3],4,5,6]
    b=copy.deepcopy(a)
    a[1]='tom'
    print(a)
    print(b)
    结果:

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

    import copy
    a=[[1,2,3],4,5,6]
    b=copy.deepcopy(a)
    b[1]='tom'
    print(a)
    print(b)
    结果:

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

    import copy
    a=[[1,2,3],4,5,6]
    b=copy.deepcopy(a)
    b[0][1]='tom'
    print(a)
    print(b)
    结果;

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

    import copy
    a=[[1,2,3],4,5,6]
    b=copy.deepcopy(a)
    a[0][1]='tom'
    print(a)
    print(b)
    结果:

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

    copy函数也可以浅拷贝:

    import copy
    a=[[1,2,3],4,5,6]
    b=copy.copy(a)
    a[0][1]='tom'
    print(a)
    print(b)
    结果:

       [[1, 'tom', 3], 4, 5, 6]
       [[1, 'tom', 3], 4, 5, 6]



    
    
    
    
    
    


  • 相关阅读:
    table拖动列宽
    解决 wm_concat函数 长度不够问题
    「Luogu」[JSOI2007]字符加密 解题报告
    Markdown数学符号
    「P5004」专心OI
    「CF242E」XOR on Segment 解题报告
    「CF86D」Powerful array 解题报告
    「USACO08JAN」电话线Telephone Lines 解题报告
    「Luogu P2015」二叉苹果树 解题报告
    「Luogu P3866」[TJOI2009]战争游戏 解题报告
  • 原文地址:https://www.cnblogs.com/bianhao89757/p/10239688.html
Copyright © 2011-2022 走看看