• python深浅拷贝原理


    一、对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址,
    不会重复在内存中开辟空间。(如下图,简要分析)

     1 #对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址
     2 import copy
     3 a1 = 123123
     4 b1 = 123123
     5 print(id(a1))
     6 print(id(b1))   #赋值相同的两个变量,内存地址一样
     7 a2 = a1         #赋值,内存地址一样
     8 print(id(a2))
     9 a3 = copy.copy(a1)
    10 print(id(a3))   #浅拷贝,内存地址也一样
    11 a4 = copy.deepcopy(a1)
    12 print(id(a4))   #深拷贝,内存地址一样
    13 
    14 #输出结果:
    15 4985344
    16 4985344
    17 4985344
    18 4985344
    19 4985344
    二、对于元组、列表、字典等来说

    赋值,只是创建一个变量,该变量指向原来内存地址;

    1 #赋值
    2 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
    3 n2 = n1         #赋值,内存ID是一样的
    4 print(id(n1))
    5 print(id(n2))
    6 
    7 #执行结果:
    8 8430056
    9 8430056

    浅拷贝,在内存中只额外创建第一层数据,值的存放位置不变;

    #浅拷贝
    import copy
    n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
    n3 = copy.copy(n1)   #浅拷贝,额外创建第一层(内存ID改变,指向值不变)
    print(id(n1))
    print(id(n3))
    print(id(n1["k3"]))    #值指向内存地址是一样的
    print(id(n3["k3"]))
    
    #执行结果:
    5022184
    5549032
    6362456
    6362456

    深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。


     1 #深拷贝
     2 import copy
     3 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
     4 n4 = copy.deepcopy(n1)    #深拷贝,所有重新创建一份(内存ID改变)
     5 print(id(n1))
     6 print(id(n4))
     7 
     8 #执行结果:
     9 6791656
    10 6791896
    应用:
     1 #应用,浅拷贝,改变新文件,旧文件跟着改变
     2 import copy
     3 dic = {
     4     "cpu":[80,],
     5     "mem":[80,],
     6     "disk":[80,]
     7 }
     8 print("before",dic)
     9 new_dic = copy.copy(dic)   #浅拷贝后,改变新文件,连带旧文件一起改变了
    10 new_dic["cpu"][0] = 50
    11 print(dic)
    12 print(new_dic)
    13 
    14 #执行结果:
    15 before {'mem': [80], 'disk': [80], 'cpu': [80]}
    16 {'mem': [80], 'disk': [80], 'cpu': [50]}
    17 {'mem': [80], 'disk': [80], 'cpu': [50]}
     1 #应用,深拷贝,改变新文件,旧文件不会改变
     2 import copy
     3 dic = {
     4     "cpu":[80,],
     5     "mem":[80,],
     6     "disk":[80,]
     7 }
     8 print("before",dic)
     9 new_dic = copy.deepcopy(dic)   #深拷贝后,改变新文件,旧文件不会改变
    10 new_dic["cpu"][0] = 50
    11 print(dic)
    12 print(new_dic)
    13 
    14 #执行结果:
    15 before {'mem': [80], 'disk': [80], 'cpu': [80]}
    16 {'mem': [80], 'disk': [80], 'cpu': [80]}
    17 {'mem': [80], 'disk': [80], 'cpu': [50]}
     
    
    
  • 相关阅读:
    CF1095F Make It Connected
    【ZJOI2016】旅行者
    [COCI 2009] OTOCI / 极地旅行社
    Sum in the tree
    MST Unification
    【集训队作业2018】Simple Tree
    [COCI2009]Dvapravca
    python 网络编程-02 多进程的交互案例
    python 日志模块logging
    python 网络编程-01基础
  • 原文地址:https://www.cnblogs.com/repo/p/5425774.html
Copyright © 2020-2023  润新知