zoukankan      html  css  js  c++  java
  • Ⅵ:深浅copy

    什么是深浅拷贝

    • 浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表。即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表也跟着变-
      cmd-markdown-logo
    • 深拷贝:将两个列表的改操作完全的独立开。即不管原列表对第几层地址的改操作,新列表都不受影响,保持最开始复制的列表元素不变。
      cmd-markdown-logo

    怎么用深浅拷贝?

    '''
    浅拷贝:列表中的不可变类型元素改变,新列表中的不可变类型元素不变,
    列表中的可变类型元素改变,新列表的不可变类型元素也跟着变
    '''
    list1 = ['Umi', 2233, ['Egon', 'Alex']]
    list2 = list1.copy()
    print('list1:', id(list1), id(list1[0]), id(list1[1]), id(list1[2]))
    print('list2:', id(list2), id(list2[0]), id(list2[1]), id(list2[2]))
    print(list1)    # ['Umi', 2233, ['Egon', 'Alex']]
    print(list2)    # ['Umi', 2233, ['Egon', 'Alex']]
    
    # 对于不可变类型的赋值、都是产生了新值,让原列表的索引指向新的内存地址、并不会影星新列表
    list1[0] = 'UMI'
    list1[1] = 21
    '''
    但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,
    即原列表的索引指向仍然指向原来的内存地址,
    于是新列表也跟着受影响,如下
    '''
    list1[2][0] = 'EGON'
    list1[2][1] = 'ALEX'
    print(list1)    # ['UMI', 21, ['EGON', 'ALEX']]
    print(list2)    # ['Umi', 2233, ['EGON', 'ALEX']]
    
    
    # 深拷贝
    import copy
    list1 = ['Umi', 2233, ['Egon', 'Alex']]
    list2 = copy.deepcopy(list1)
    #                  不可变        不可变          可变
    print('list1:', id(list1[0]), id(list1[1]), id(list1[2]))
    print('list2:', id(list2[0]), id(list2[1]), id(list2[2]))
    
    list1[0] = 'UMI'
    list1[1] = 21
    list1[2][0] = 'EGON'
    list1[2][1] = 'ALEX'
    print(list1)    # ['UMI', 21, ['EGON', 'ALEX']]
    print(list2)    # ['Umi', 2233, ['Egon', 'Alex']]
    
  • 相关阅读:
    排列组合例题分析
    短信微服务+springboot+redis整合,动态获取短信验证码
    mac版idea 2018.3.5版 永久激活教程
    windows版idea 2018.3.5版 永久激活教程
    深入理解 Java 垃圾回收机制
    如何写代码 —— 编程内功心法
    并发与并行的区别
    Lua语法要点
    android 手机上运行图像算法
    OPENCL 错误码
  • 原文地址:https://www.cnblogs.com/qujiu/p/12453719.html
Copyright © 2011-2022 走看看