深浅拷贝原理

 对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝永远指向同一个内存地址。

 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

 

posted @ 2018-05-16 16:47  重铸根基  阅读(361)  评论(0编辑  收藏  举报