标签:name Python print 拷贝 copy id friend
深拷贝、浅拷贝
1. 浅拷贝
浅拷贝是对于一个对象的顶层拷贝
import copy a = [[1, 2], 3] b = copy.copy(a) print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) print(id(a[1])) print(id(b[1])) a[0].append(1) print(a) print(b)
输出结果:
2249583452872 2250135748552 2249583452808 2249583452808 140714232963984 140714232963984 [[1, 2, 1], 3] [[1, 2, 1], 3]
copy()是浅拷贝,只拷贝了最顶层的数组,而数组中的内容只是拷贝了引用。
因此用a[0].append(1)方法后,数组a和b都发生了改变。
2. 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
import copy a = [[1, 2], 3] b = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) a[0].append(1) print(a) print(b)
输出结果:
1931836547784 1932360400776 1931836547720 1931837818120 [[1, 2, 1], 3] [[1, 2], 3]
deepcopy()是深拷贝,不仅拷贝最顶层的数组,数组里的内容也拷贝了,这里不同于拷贝引用,也是创建了新的地址空间,存放的内容和原数组相同。因此这次用a[0].append(1)后,b数组没有发生变化。
3.拷贝的其他方式
分片拷贝浅拷贝
import copy a = [[1, 2], 3] b = a[:] print(id(a)) print(id(b)) print(id(a[0])) print(id(b[0])) print(id(a[1])) print(id(b[1])) a[0].append(1) print(a) print(b)
输出结果:
2672287769288 2672811617864 2672287769224 2672287769224 140714232963984 140714232963984 [[1, 2, 1], 3] [[1, 2, 1], 3]
可见:分片拷贝是浅拷贝。
字典的copy()方法
d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying']) c = d.copy() print(d) print(c) print(id(d)) print(id(c)) print(id(d['name'])) print(id(c['name'])) print(id(d['friend'])) print(id(c['friend'])) d['friend'].append('lisa') print(d) print(c)
结果:
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']} {'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']} 2175018372336 2175021103360 2175021498672 2175021498672 2175017902728 2175017902728 {'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']} {'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
可见,字典的copy()方法也是浅拷贝。
4.注意
copy()和deepcopy()对于不包含可变类型数据的元组,只会拷贝引用
import copy d = (1, 2, 3) c = copy.copy(d) b = copy.deepcopy(d) print(id(d)) print(id(c)) print(id(b))
结果:
1959295969464 1959295969464 1959295969464
当deepcopy()对于包含可变类型数据的元组时,才会拷贝整个元组的内容
import copy d = (1, 2, [1,2,3]) c = copy.copy(d) b = copy.deepcopy(d) print(id(d)) print(id(c)) print(id(b))
结果:
2774011472056 2774011472056 2774011384024
标签:name,Python,print,拷贝,copy,id,friend 来源: https://www.cnblogs.com/crazyechoaoo/p/10743881.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。