Python关于深拷贝和浅拷贝的理解

Python关于深拷贝和浅拷贝的理解
一.浅拷贝

a = 1000
b = a
此时即为浅拷贝,a变量和b变量的id相同

浅拷贝只是将要拷贝内容的引用传给b,即a和b此时指的是同一块内存地址上的内容。
二.深拷贝
1)copy.deepcopy()

import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b]
d=copy.deepcopy(c)
此时通过查看id发现,c和d的id并不相同
#向a中加入元素
a.append(7)
#此时c=[[1,2,3,7],[4,5,6]]		d=[[1,2,3],[4,5,6]]
发现当给a列表添加元素时,c变化,d不变

上例就是深拷贝。深拷贝会将要拷贝对象的内容、包括要拷贝对象内其他对象的引用所指向的对象一起拷贝(如果有引用,就根据引用找到内容进行拷贝,不会拷贝引用,只拷贝内容),就相当于深度优先算法,将其中所有内容拷贝到新的内存地址,不会受原对象的影响。
2)copy.copy()
在导入copy包后发现还有一个方法copy.copy()

import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b]		#c写为列表
d=(a,b)		#d写为元组
e=copy.copy(c)
f=copy.copy(d)
此时通过查看id发现,e和c的地址不同,f和d的地址相同
#向a中加入元素
a.append(7)
#此时c=[[1,2,3,7],[4,5,6]]		e=[[1,2,37],[4,5,6]]    f=([1,2,37],[4,5,6])
发现当给a列表添加元素时,c和e和f都发生变化

经过上例和查阅书籍发现,copy.copy()方法在拷贝不可修改类型的数据时,作用就相当于浅拷贝,即f直接指向d的内存地址;在拷贝可修改类型时,作用就相当于之拷贝一层的deepcopy(),只是将c中存储的a和b的引用拷贝过来,放到新的内存地址中,并不会更深层的拷贝a和b的内容。因此,向a中添加元素,因为e中有a的引用,所以e也会发生变化。

补充:
不可变类型:整型、字符串、元组、
可变类型:列表、字典、集合
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值