• Ⅵ:深浅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']]
    
  • 相关阅读:
    解决在火狐中不支持onreadystatechange的方法
    jquery ajax与分页的实现(mvc下)
    通过ChekBox设置EditText内容是否呈现密码显示
    Android自定义dialog
    Android Intent笔记
    启动另外的一个应用程序的Activity(三种方式)(转载)
    Android代码中声明一个layout
    在Linux下创建函数库
    五分钟讲清楚UML
    QT中使用QProcess启用外部程序
  • 原文地址:https://www.cnblogs.com/qujiu/p/12453719.html
Copyright © 2020-2023  润新知