python中深拷贝,浅拷贝

 

 

#_author:'DJS'
#date:2018-12-09
#一个变量等于xx是指向,浅拷贝拷贝的是最顶层(拷贝的是引用而不是数据)的,深拷贝拷贝的是全部(相当于备份)
import copy
import sys
print(sys.path) #查看导入模块的先后路径
a = [1,2,3] #表示的a指向这个列表
b = [4,5,6,]
print(id(a))
print(id(b))

b.append(7)
print(b)

c = copy.deepcopy(b) #深拷贝,只拷贝数据值,不拷贝内存的地址
print(c)
print(id(c))
b.append(8)
print(b)
print(c)

##copy.copy() #浅拷贝,把xx里面的东西拷贝出来,但是数据不拷贝,直接拷贝它的指向(即引用)。
即在另外一个列表中的数据指向是不变的
浅拷贝,拷贝xx时候指向了一个新列表,列表里面的东西指向不变。只是多了一个列表,开辟多了一份
内存。浅拷贝共享的是拷贝时的数据(如a,b数据,a,b加数据的时候e里面的数据也会加),后面多加的不共享
如c里面多加一个列表,那么e不会共享c里面多加的列表
c = [a,b]
d = c
e = copy.copy(c)
# print(id(e))
# print(id(c))
print(id(c[0]))
print(id(e[0]))
a.append(66)
print(c)
print(e)


##copy.deepcopy() #深拷贝,平时用的复制属于深拷贝
c = [a,b]
d = copy.deepcopy(c)
a.append(77)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0])) #深拷贝的时候,开辟新的内存空间,然后拷贝数据过去。数据的指向变了。
print(c)#
print(d)#a中增加数据,但是d中没有增加
a = (2,3) #元组是不可变类型,如果copy.copy()拷贝的是元组,不是浅拷贝,因为元组是不可变类型
#所以数据是不开修改的,所以copy.copy()拷贝的是元组的时候就是指向了。不是浅拷贝了
b = copy.copy(a)
print(id(a))
print(id(b))

###如果用copy.copy()或者copy.deepcopy()对一个全部都是不可变类型(如元组,或者字符串,数字)的数据进行拷贝,那么
#他们的结果相同,都是引用指向。如果拷贝的是一个拥有不可变类型的数据(相当于元组里面有列表),即使元组时最顶层
#那么copy.deepcopy()依然是深拷贝(拷贝全部的数据,而不是指向)。而copy.copy()还是指向
#即是copy.copy()拷贝元组的时候是指向全部,拷贝列表的时候不是指向正个列表,而是创建一个新的列表
#再指向被拷贝的列表的数据。即是copy.copy()拷贝可变的数据时不能把他整个内存地址考出来
#但是拷贝不可变的数据的时候,可以把内存地(引用指向)址也拷贝了。可变的拷贝不完,不可变的可以拷贝完。
a = [1,3,2]
b = [3,4,5]

e = (a,b)
f = copy.copy(e) #浅拷贝,拷贝元组的时候照样是拷贝全部的指向。整个元组的指向
print(id(e))
print(id(f))
h = copy.deepcopy(e)#深拷贝,拷贝元组的时候
print(id(e))
print(id(h))




python中复制即引用,也可以认为是浅拷贝。

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值