• python之深浅拷贝


    1. 什么是深浅拷贝

    • 我的理解:
      • 浅拷贝:列表嵌套列表,子列表会变,父列表不会变
      • 深拷贝:都不变

    1.1 赋值

    • 赋值不是拷贝
    l1 = [1,2,3,4,[5,6,7,]]
    l2 = l1  # 赋值    赋值不是拷贝  多个变量指向同一个内存地址 一个变都变
    l1.append(8)
    print(l1)
    print(l2)
    
    '''
    输出结果
    [1, 2, 3, 4, [5, 6, 7], 8]
    [1, 2, 3, 4, [5, 6, 7], 8]
    '''
    # 个人见解:
    # 赋值都指向同一个内存地址,值相同,值发生变化都变化
    

    1.2 浅拷贝

    • 只拷贝第一层
    • 浅拷贝会创建一个新的列表(容器)
    • 新创建的列表中的元素和原列表的元素用的是同一个内存空间
    l1 = [1,2,3,4,[4,5,6]]
    l2 = l1[:]   # 浅拷贝
    l2 = l1.copy() # 浅拷贝  -- 只拷贝第一层
    print(id(l1[0]))
    print(id(l2[0]))
    '''
    输出结果
    4438958224
    4438958224
    很明显内存地址相同
    '''
    
    # 个人见解:
    # l1中的[4,5,6]会变,外层不会变
    

    1.3 深拷贝

    • 不可变的数据类型和原列表指向同一个空间

    • 可变数据会创建一个新的空间

    import copy
    li = [1,2,3,4,5,[6,7,8]]
    l2 = copy.deepcopy(li)
    li[-1].append(678)
    print(li)
    print(l2)
    
    '''
    输出结果
    [1, 2, 3, 4, 5, [6, 7, 8, 678]]
    [1, 2, 3, 4, 5, [6, 7, 8]]
    '''
    
    
    import copy
    li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
    l2 = copy.deepcopy(li)
    li[-1]['k'] = "a"
    print(li)
    print(l2)
    
    [3, 4, 5, [1, 2, 3, 4], 6, 7, 8, {'k': 'a'}]
    [3, 4, 5, [1, 2, 3, 4], 6, 7, 8, {'k': 'v'}]
    
    '''
    个人见解:
    深拷贝都不变
    '''
    

    2. 深浅拷贝怎么用

    dic = {}   # "v":4
    li = []    #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
    for i in range(0,5):
        dic["v"] = i
        li.append(dic)
    print(li)
    
    '''
    输出结果
    [{'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}]
    '''
    

    3. 深浅拷贝在哪里用

    • 1.面试
    • 2.不让修改原数据的时候,使用

    电脑教学 鼠标写字工具

    4. 练习题

    # 看代码写结果
    l1 = [1,2,3,4,[5,6,7,]]
    l2 = l1  # 赋值    赋值不是拷贝
    l1.append(8)
    print(l1)
    print(l2)
    '''
    结果:
    
    '''
    
    l1 = [1,2,3,4,[4,5,6]]
    l2 = l1[:]   # 浅拷贝
    l2 = l1.copy() # 浅拷贝  -- 只拷贝第一层
    print(id(l1[0]))
    print(id(l2[0]))
    '''
    结果
    
    '''
    
    l1 = [1,2,3,4]
    l2 = l1.copy()
    print(l1)
    print(id(l1))
    print(id(l2))
    print(id(l1[0]))
    print(id(l2[0]))
    '''
    结果
    
    '''
    
    li = [1,2,32,[3,4,5]]
    l2 = li.copy()
    
    li.append(8)
    print(l2)
    print(li)
    
    li[-1].append(8)
    print(l2)
    '''
    结果
    
    '''
    
    
    l1 = [1,2,3,(1,2,3)]
    l2 = l1.copy()
    l2[-1] = 6
    print(l1)
    print(l2)
    '''
    结果
    
    '''
    
    l1 = [1,2,3,4,[5,6,7,]]
    l2 = l1.copy()
    l1[-1].append(8)
    print(l2)
    '''
    结果
    
    '''
    
    li = [1,2,3,4,]
    l2 = li  # 赋值   两个变量指向了一个列表内存地址
    li.append(9)
    print(l2)
    '''
    结果
    
    '''
    
    l1 = [1,2,3,4,5,]
    l2 = l1.copy()
    l1.append(8)
    print(l2)
    print(l1)
    '''
    结果
    
    '''
    
    l1 = [1,2,3,[4,5,6]]
    l2 = l1.copy()
    l2[-1] = 77
    print(l1)
    print(l2)
    '''
    结果
    
    '''
    
    import copy
    li = [1,2,3,4,5,[6,7,8]]
    l2 = copy.deepcopy(li)
    print(li)
    # print(id(li))
    print(id(li[-1]))
    print(l2)
    # print(id(l2))
    print(id(l2[-1]))
    '''
    结果
    
    '''
    
    import copy
    li = [1,2,3,4,5,[6,7,8]]
    l2 = copy.deepcopy(li)
    li[-1].append(678)
    print(l2)
    '''
    结果
    
    '''
    
    import copy
    li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
    l2 = copy.deepcopy(li)
    li[-1]['k'] = "a"
    print(li)
    print(l2)
    '''
    结果
    
    '''
    
    dic = {}   # "v":4
    li = []    #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
    for i in range(0,5):
        dic["v"] = i
        li.append(dic)
    print(li)
    '''
    结果
    
    '''
    
  • 相关阅读:
    JS开发技巧
    Git push 常见用法
    关闭浏览器标签
    vue 样式穿透 watch深度监听
    Git Commit Template 提交模板
    常用git stash命令:
    Windows下安装及使用NVM
    JS正则表达式
    js转码
    多行文本溢出显示省略号(…)全攻略
  • 原文地址:https://www.cnblogs.com/zanao/p/11007819.html
Copyright © 2020-2023  润新知