深浅拷贝原理
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝永远指向同一个内存地址。
1 import copy 2 n1 =123 3 # 通过id()函数来查看内存地址来 4 print(id(n1)) 5 # 赋值 6 n2 =n1 7 print(id(n2)) 8 # 浅拷贝 9 n2 = copy.copy(n1) 10 print('浅拷贝值:',n2) 11 print(id(n2)) 12 13 # 深拷贝 14 n3 = copy.deepcopy(n1) 15 print('深拷贝值:',n3) 16 print(id(n3))
结果;
140730477588992 140730477588992 浅拷贝值: 123 140730477588992 深拷贝值: 123 140730477588992
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
import copy n1 = {'k1':123,'name':'baiyuechu','涂山':['涂山红红','涂山蓉蓉','涂山雅雅'],'fj':{'qz':['jq','ss','ax']}} n2 =n1 print('赋值:',n2) print(id(n1)) print(id(n2)) # 浅拷贝只能拷贝第一层数据,拷贝数据修改时会将原数据修改掉 n3 = copy.copy(n1) n3['涂山'][0] = 12 print('被浅拷贝修改的原数据',n1) print('浅拷贝值:',n3) print(id(n1)) print(id(n3))
结果:
1 赋值: {'k1': 123, 'name': 'baiyuechu', '涂山': ['涂山红红', '涂山蓉蓉', '涂山雅雅'], 'fj': {'qz': ['jq', 'ss', 'ax']}} 2 2466206023328 3 2466206023328 4 被浅拷贝修改的原数据 {'k1': 123, 'name': 'baiyuechu', '涂山': [12, '涂山蓉蓉', '涂山雅雅'], 'fj': {'qz': ['jq', 'ss', 'ax']}} 5 浅拷贝值: {'k1': 123, 'name': 'baiyuechu', '涂山': [12, '涂山蓉蓉', '涂山雅雅'], 'fj': {'qz': ['jq', 'ss', 'ax']}} 6 2466206023328 7 2466210205912
深拷贝:
1 import copy 2 3 n1 = {'k1':123,'name':'baiyuechu','涂山':['涂山红红','涂山蓉蓉','涂山雅雅'],'fj':{'qz':['jq','ss','ax']}} 4 5 # 深拷贝,修改数据不会改变原数据 6 n4 = copy.deepcopy(n1) 7 n4['涂山'][0] = 12 8 print('深拷贝的原数据',n1) 9 print('深拷贝值:',n4) 10 print(id(n1)) 11 print(id(n4))
结果:
1 深拷贝的原数据 {'k1': 123, 'name': 'baiyuechu', '涂山': ['涂山红红', '涂山蓉蓉', '涂山雅雅'], 'fj': {'qz': ['jq', 'ss', 'ax']}} 2 深拷贝值: {'k1': 123, 'name': 'baiyuechu', '涂山': [12, '涂山蓉蓉', '涂山雅雅'], 'fj': {'qz': ['jq', 'ss', 'ax']}} 3 1381534826144 4 1381567385888