深浅拷贝的理解

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

深浅拷贝的理解_第1张图片
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
>>>

深浅拷贝的理解_第2张图片
(3)浅拷贝,在内存中只额外创建第一层数据

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

深浅拷贝的理解_第3张图片
(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
>>>

深浅拷贝的理解_第4张图片
案例分享:

#深浅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)

你可能感兴趣的:(python)