zoukankan      html  css  js  c++  java
  • python深拷贝与浅拷贝

    一、定义

    浅拷贝:创建一个新对象,它包含的是对原始对象中所包含想的引用。(若引用的方式修改其中一个对象,另外一个也会跟着改变)

    深拷贝:创建一个新对象,并递归的赋值它所包含的对象。(修改其中一个,另外一个是不会跟着变化的)

    二、应用

    浅拷贝:1.完全切片方法

        2.工厂函数,如 list()

        3. copy 模块中的 copy() 函数

    深拷贝:1. copy 模块下的 deep.deepcopy() 函数

    三、实例

    1.浅拷贝

     1 import copy
     2 
     3 list1 = [1, 2, 3, ['a', 'b', 'c']]
     4 list2=list1.copy()
     5 # print(id(list1))  # 1710452450504
     6 # print(id(list2))  # 1710452451784
     7 # 说明list2是在内存中独立出一个新的空间
     8 
     9 print(list2)  # [1, 2, 3, ['a', 'b', 'c']]
    10 # list1[0]='a'  # 修改了list1最外层(第一层)的值
    11 # print(list1)  # ['a', 2, 3, ['a', 'b', 'c']]
    12 # print(list2)  # [1, 2, 3, ['a', 'b', 'c']]
    13 # # list2第一层的信息并不受到list1的影响
    14 # # 并不表示内层的信息也全部复制了。
    15 
    16 # list2[0]='a' # 修改list2最外层(第一层)的值
    17 # print(list1) # [1, 2, 3, ['a', 'b', 'c']]
    18 # print(list2) # ['a', 2, 3, ['a', 'b', 'c']]
    19 # # 证实了list2和list1的第一层信息之间是没有相互影响的
    20 # # 这一步也不能证实内存的信息是否是深度复制
    21 
    22 # list1[3][0]=1 # 修改list1内层的值
    23 # print(list1)  # [1, 2, 3, [1, 'b', 'c']]
    24 # print(list2)  # [1, 2, 3, [1, 'b', 'c']]
    25 # # list1内层的值改变,list2内层的值也跟着改变
    26 # # list1和list2之间可能还存在着某种联系
    27 
    28 # list2[3][0]=1 # 修改了list2内层的值
    29 # print(list1)  # [1, 2, 3, [1, 'b', 'c']]
    30 # print(list2)  # [1, 2, 3, [1, 'b', 'c']]
    31 # # 证实list1和list2之间还是有互相影响的
    32 # # 应该是list2的内层数据信息的内存地址是指向list1的内层数据信息的地址

    2.深拷贝

     1 import copy
     2 
     3 list1 = [1, 2, 3, ['a', 'b', 'c']]
     4 list2=copy.deepcopy(list1)
     5 # 修改最外层的值其结果与浅拷贝是一致的
     6 
     7 # list1[3][0]=1
     8 # print(list1) # [1, 2, 3, [1, 'b', 'c']]
     9 # print(list2) # [1, 2, 3, ['a', 'b', 'c']]
    10 # # list1和list2是没有相互影响的
    11 
    12 # list2[3][0]=1
    13 # print(list1) # [1, 2, 3, ['a', 'b', 'c']]
    14 # print(list2) # [1, 2, 3, [1, 'b', 'c']]
    15 # # list2和list1是没有相互影响的
    16 
    17 # 证实了深拷贝是递归的复制所有数据信息的
  • 相关阅读:
    Mina入门:mina版之HelloWorld
    Mina入门:Java NIO基础概念
    Activity与Service进行数据交互
    Android 6.0权限全面详细分析和解决方案
    查看Android系统是User模式还是Eng模式
    修改 Android 5.x 系统默认音量大小
    Android执行程序或脚本的方法
    Android Launcher 3 简单分析
    将Android系统源码导入ecplise
    Scrum三大角色特点
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9328391.html
Copyright © 2011-2022 走看看