1.为什么要拷贝?
当进行修改时,想要保留原来的数据和修改后的数据
2.数字字符串 和 集合 在修改时的差异? (深浅拷贝不同的终极原因)
在修改数据时:
数字字符串:在内存中新建一份数据
集合:修改内存中的同一份数据
3.对于集合,如何保留其修改前和修改后的数据?
在内存中拷贝
4.对于集合,如何拷贝其n层元素同时拷贝?
深拷贝
1.对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
赋值,内存指向同一地址
>>> n1=123
>>> n2=n1
>>> id(n1)
10109728
>>> id(n2)
10109728
>>>
>>> import copy
>>> n3 = copy.copy(n1)
>>> id(n3)
10109728
>>> n4=copy.deepcopy(n1)
>>> id(n4)
10109728
2.对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
赋值,只是创建一个变量,该变量指向原来内存地址,如:
>>> import copy
>>> n1 = {'k1':'v1','k2':'v2','k3':['liuyao','job']}
>>> n1
{'k3': ['liuyao', 'job'], 'k1': 'v1', 'k2': 'v2'}
>>> n2=n1
>>> id(n1)
140120750514696
>>> id(n2)
140120750514696
>>> id(n2['k3'])
140120750335688
>>> id(n1['k3'])
140120750335688
>>> id(n1['k3'][0])
140120778934064
>>> id(n2['k3'][0])
140120778934064
>>>
>>> import copy
>>> n1 = {'k1':'v1','k2':'v2','k3':['liuyao','job']}
>>> n2 = copy.copy(n1)
>>> id(n1)
140120750337544
>>> id(n2)
140120750371208
>>> id(n1['k3'][0])
140120778934064
>>> id(n2['k3'][0])
140120778934064
>>>
(4)深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
>>> import copy
>>> n1 = {'k1':'v1','k2':'v2','k3':['liuyao','job']}
>>> n2 = copy.deepcopy(n1)
>>> id(n1)
140120750514696
>>> id(n2)
140120750514888
>>> id(n1['k3'])
140120750335688
>>> id(n2['k3'])
140120750335752
>>> id(n2['k3'][0])
140120778934064
>>> id(n1['k3'][0])
140120778934064
>>>
#深浅copy案例:监控模板
dic = {
"cpu":[80,],
"mem":[70,],
"disk":[90,],
}
print(dic)
a1=copy.copy(dic)
#浅copy会使所有的模板cpu都发生变化
a1['cpu'][0]=20
print(a1)
print(dic)
#为了防止新模板修改导致旧模板被修改所以使用深copy
a2=copy.deepcopy(dic)
a2['cpu'][0]=20
print(a2)
print(dic)