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