• 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]



    
    
    
    
    
    


  • 相关阅读:
    Visual Studio 2015 开发 ASP.NET 5
    全新的membership框架Asp.net Identity
    VS2013下实现移动端的跨平台开发
    用SQL语句,删除掉重复项只保留一条
    SOA IN Real World
    Asp.net负载均衡之Session
    C#时常需要调用C++DLL
    C# 支付宝接口
    好代码是怎么炼成的
    ASP.net 服务器监控
  • 原文地址:https://www.cnblogs.com/bianhao89757/p/10239688.html
Copyright © 2020-2023  润新知