python中赋值与深浅copy

赋值以及深浅copy,Python当中对于拷贝,分为两种类型。一种是数字和字符串,另一种就是列表、元组、字典等其他类型了。

	常见问题解答:
1)为什么要拷贝?
当进行修改时,想要保留原来的数据和修改后的数据
2)数字字符串和集合在修改时的差异?(深浅拷贝不同的终极原因)
 	在修改数据时:
	数字字符串:在内存中新建一份数据
     集合:修改内存中的同一份数据
3)对于集合,如何保留其修改前和修改后的数据?
在内存中拷贝一份
4)对于集合,如何拷贝其n层元素同时拷贝?

应用场景:监控模板的copy应用

深拷贝
copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式。
—–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 
—–而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

>>> import copy
>>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象
>>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

深浅拷贝都是对源对象的复制,占用不同的内存空间
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

一、数字和字符串的拷贝:
1、赋值:对于通过用 = 号赋值,数字和字符串在内存当中用的都是同一块地址。

>>> a = 123
>>> b = a
>>> id(a)
58310048
>>> id(b)
58310048

2、浅拷贝:对于浅拷贝,数字和字符串在内存当中用的也是同一块地址。

>>> import copy	# 使用浅拷贝需要导入copy模块
>>> a = 123
>>> b = copy.copy(a)	 # 使用copy模块里的copy()函数就是浅拷贝了
>>> id(a)
493149136
>>> id(b)
493149136

3、深拷贝:对于深拷贝,数字和字符串在内存当中用的也是同一块地址。

>>> import copy
>>> a = 123
>>> b = copy.deepcopy(a)	# 深拷贝是用copy模块里的deepcopy()函数
>>> id(a)
493149136
>>> id(b)
493149136

二、字典、列表、元组等其他类型的拷贝
1、赋值:对于赋值,字典、列表、元组等其他类型用的内存地址不会变化。

>>> a = {'a1':'abc','a2':123,'a3':['a4',456]}
>>> b = a
>>> id(a),id(b)
(56616256, 56616256)

2、浅拷贝:对于浅拷贝,字典、列表、元组等类型,它们只拷贝第一层地址。

>>> import copy
>>> a = {'a1':'abc','a2':123,'a3':['a4',456]}
>>> b = copy.copy(a)
>>> id(a),id(b)
(61389824, 61082864)
>>> id(a['a3']),id(b['a3'])
(61326760, 61326760)
通过以上结果可以看出,进行浅拷贝时,我们的字典第一层n1和n3指向的内存地址已经改变了,但是对于第二层里的列表并没有拷贝,它的内存地址还是一样的

3、深拷贝:对于深拷贝,字典、列表、元组等类型,它里面嵌套多少层,就会拷贝多少层出来,但是最底层的数字和字符串地址不变。

>>> import copy
>>> a = {'a1':'abc','a2':123,'a3':['a4',456]}
>>> b = copy.deepcopy(a)
>>> id(a),id(b)				# 第一层字典的内存地址:
(61396912, 56616256)
>>> id(a['a3']),id(b['a3']) 			#	第二层嵌套的列表的内存地址:
(61259168, 61258968)

进行深拷贝时,字典里面的第一层和里面嵌套的地址都已经变了。对于深拷贝,它会拷贝多层,将第二层的列表也拷贝一份,如果还有第三层嵌套,那么第三层的也会拷贝,但是对于里面的最小元素,比如数字和字符串,这里就是“abc”,123,“alex”,"a4"之类的,按照python的机制,它们会共同指向同一个位置,它的内存地址是不会变的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值