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

 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]}