ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

032 深浅拷贝

2019-08-06 20:03:48  阅读:238  来源: 互联网

标签:lt2 print lt 深浅 032 拷贝 copy id


一.拷贝

拷贝实际上其实就是在赋值,比如我们有一个列表L1,定义另一个列表L2引用列表L1,实际上就是在拷贝列表L1的值,由于由于L1列表是可变的数据类型,所以当L1的值变的时候,L2的值也是在跟着变的.那其实就算L1内的是不可变的数据类型,L1的内容变化,L2的内容也一样会随之变化的

# # 拷贝(赋值)
lt = [1, 2, 3]
lt2 = lt

lt.append(4)
print(lt)
# [1, 2, 3, 4]
# 因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化
print(lt2)
# [1, 2, 3, 4]

二.浅拷贝

浅拷贝时,我们时需要在写代码前import.copy,导入copy的方法,其实列表在内存空间里是以索引的形式存在的,索引指向的才是对应的具体的值,那当我们用L2去copy列表L1的时候,那他们两个列表的索引只想的值都是一样的,如果L1的某一索引对应的值有变化的时候,L2这个列表是否变化是取决于L1列表变化的那个索引的值是否为可变化数据类型。也就是说当L1列表内的数据是可变化类型的化,L2会随之变化:L1列表内的数据是不可变的数据类型,那L2列表的数据则不会跟着变化。

# 浅拷贝
# copy.copy()
import copy

l1 = ['xichen','nick','egon',['rockey','pilipili']]
l2 = copy.copy(l1)
l1.append('xuchen')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili'], 'xuchen'] 
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili']]

l1[-1].append('xucheng')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]

3.深拷贝

深拷贝和浅拷贝一样,在写代码之前需要import.copy导入copy的方法,但是我们深拷贝的时候用的是deepcopy,其他的语法和浅拷贝是一样的,但是深拷贝和浅拷贝不一样的是,深拷贝不管列表L1里面的内容是可变还是不可变的,当L1变化的时候,L2列表里面的数据都不会改变的

import copy
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
# id(lt) 2608713900296
# id(lt[0]) 2608710450544
# id(lt[1]) 2608593350352
# id(lt[2]) 2608594909872
# id(lt[3]) 2608713954696
**************************************************

lt2 = copy.deepcopy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)
# id(lt2) 2608713900616
# id(lt2[0]) 2608710450544
# id(lt2[1]) 2608593350352
# id(lt2[2]) 2608594909872
# id(lt2[3]) 2608713900744
**************************************************

总结:

牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型
拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值
浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化copy.copy()   可变数据的类型中的内置方法.copy()
深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变copy.deepcopy()

标签:lt2,print,lt,深浅,032,拷贝,copy,id
来源: https://www.cnblogs.com/xichenHome/p/11311447.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有