python-深拷贝与浅拷贝

120 篇文章 1 订阅

当一个变量=xxx的时候,约定为: 指向地址的过程

如果copy.copy()拷贝的是元组,那么它不会进行浅拷贝,仅仅是指向
因为元组是不可变数据类型,那么意味着数据一定不能修改,因此用copy.copy的
时候它会自动判断,是指向。

如果,用copy.copy() copy.deepcopy()对一个全部是不可变类型的数据进行
数据拷贝,那么它们的结果相同,都是指向。
如果拷贝的是一个拥有可变类型的数据,那么deepcopy依然是深拷贝,而copy.copy还是指向。

浅拷贝:copy.copy()
深拷贝:copy.deepcopy()

In [38]: import copy

In [39]: a = [11,22]

In [40]: b = [33,44]

In [41]: c = [a,b]

In [42]: c
Out[42]: [[11, 22], [33, 44]]

In [43]: d = copy.copy(c)	#d浅拷贝

In [44]: id(c)
Out[44]: 140233732341960

In [45]: id(d)
Out[45]: 140233713050888	#列表为可变数据类型,浅拷贝创建新地址,里面的列表仍然为指向

In [46]: id(c[0])
Out[46]: 140233732292488

In [47]: id(d[0])
Out[47]: 140233732292488	#仅仅是指向

In [48]: id(a)
Out[48]: 140233732292488

In [49]: e = copy.deepcopy(c)	#e为深拷贝

In [50]: id(e)
Out[50]: 140233732321800	#深拷贝,创建一个新地址并且指向

In [51]: id(c)
Out[51]: 140233732341960

In [52]: id(c[1])
Out[52]: 140233731307720

In [53]: id(e[1])
Out[53]: 140233713173832	

In [54]: id(d[1])
Out[54]: 140233731307720	#内部也创建新地址

 In [55]: a = [11,22]		#a,b均为列表
    
 In [56]: b = [33,44]

In [57]: c = [a,b]		#c为列表嵌套列表

In [58]: d = copy.copy(c)	#d浅拷贝

In [59]: e = copy.deepcopy(c)	#e深拷贝

In [60]: id(c)
Out[60]: 140233732324104	

In [61]: id(d)
Out[61]: 140233740633608	

In [62]: id(e)
Out[62]: 140233732090888

In [63]: c.append([55,66])	#给c添加新列表

In [64]: c
Out[64]: [[11, 22], [33, 44], [55, 66]]

In [65]: d
Out[65]: [[11, 22], [33, 44]]	#de不变

In [66]: e
Out[66]: [[11, 22], [33, 44]]

In [73]: a = [11,22]	#a,b是列表

In [74]: b = [33,44]	

In [75]: c = (a,b)	#c是元组,不可变数据类型

In [76]: c
Out[76]: ([11, 22], [33, 44])

In [77]: d = copy.copy(c)	#d为浅拷贝
	
In [78]: id(c)
Out[78]: 140233732322440

In [79]: id(d)
Out[79]: 140233732322440	#d仅仅为指向

In [80]: e = copy.deepcopy(c)	#e为深拷贝

In [81]: id(e)
Out[81]: 140233713145672	#e创建了新地址

In [82]: id(c)
Out[82]: 140233732322440

In [83]: id(c[1])
Out[83]: 140233713122504

In [84]: id(e[1])
Out[84]: 140233731173640	#e中索引值为1的元素新建地址

In [85]: id(d[1])
Out[85]: 140233713122504	#d中索引值为1的元素仍然为指向

In [86]: a.append(55)

In [87]: c
Out[87]: ([11, 22, 55], [33, 44])

In [88]: e
Out[88]: ([11, 22], [33, 44])

[] :
列表

[[],[]] 
    浅拷贝 里面的不变 外面的变
    深拷贝 里面的变  外面的变

元组

(,)        	浅拷贝 深拷贝 不变

([],[])        浅拷贝 外面不变   里面不变
       	 	 深拷贝 外面的变    里面的变
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值