谈谈复制问题(赋值,浅拷贝,深拷贝)

先前在克隆列表里面谈过拷贝的问题,今天就来详细的说说复制。

先总结性的来一句,其实赋值,浅拷贝,深拷贝区别在于对复制的对象及对象内部的修改是否会影响到原对象

赋值很容易理解,就是把一个数值或者一个对象赋给某一个变量的过程,他没有开辟新的内存空间,仅仅是复制了原对象的引用。

赋值:传值和传引用(地址)

传值

a = 2
b=a
b = b+1
print(a)
print(b)

#这是对基本数据类型的赋值操作
#运行后a = 2,b = 3,可见传值后对新的对象修改,不会影响原对象的值

传引用

在python中,数据分为基础数据类型和引用数据类型,对基础数据类型赋值后,两变量互不影响,而对引用数据类型进行赋址操作,两变量指向同一个对象(这里把地址当作对象),改变变量a会影响变量b(地址会变)哪怕是改变其中一个的基础数据类型。

ahayia = ['when','what','how',['ww',12,'yy']] #第一个变量
ohou = ahayia 
#两次输出两变量的地址 都不变,ohou变量追加一个元素后原变量立刻也追加相同元素
print(id(ohou))
print(id(ahayia))

ohou.append(234)
print(id(ahayia))
print(id(ohou))
print(ohou)
print(ahayia)

 

实际开发中我们不愿意出现修改一个对象的值,另一个对象也会改变的情况,所以这时候用到拷贝,接下来就讲讲深浅拷贝的问题。

浅拷贝

对不可变数据类型(Number,String,Tuple)仅仅只是拷贝值,不改变拷贝后的地址指向,对可变的数据类型也是如此。也就是说,浅拷贝俩对象的内存地址不变。浅拷贝的方法是copy.copy()

 

#Number类型
num = 20
num1 = copy.copy(num)

print('num的地址:'+str(id(num)))
print('num1的地址:'+ str(id(num1)))
#String类型
str1 = 'hello'
str2 = copy.copy(str1)

#仅仅是拷贝了值,两个对象指向同一内存地址
print('第一次str1的内存地址'+str(id(str1)))
print('第一次str2的内存地址'+str(id(str2)))
str2 = str2+'world'
print(str1,str2) 
#为了验证浅拷贝的对象修改后不会影响原对象的值,(此刻内存地址变了)这里str1是hello,str2是helloworld

print('str1的内存地址'+str(id(str1)))
print('修改后str2的内存地址'+str(id(str2)))

深拷贝

顾名思义更深层次的拷贝,是为复制创建了新的对象,开辟了一块内存来保存复制的结果,具体演示的例子是一个元组里面套了一个列表。

#Tuple类型
tup1 = (12,"what",[134,5,'why'])
tup2 = copy.deepcopy(tup1) #深拷贝,独立开辟一个内存空间
tup3 = copy.copy(tup1)  #浅拷贝,顾名思义是只能对顶层的拷贝,如果修改其他层,原对象就会发生改变
#print(tup2)
print(id(tup3))  #浅拷贝不改变内存地址
tup3[2].append('aha')
print(tup1)
#在这个元组的子列表里面追加一个元素
tup2[2].append('when')
print(tup1)
print(tup2)
print("tup1的地址:"+str(id(tup1)))
print("tup2的地址:"+str(id(tup2)))



'''结果
1733721046760
(12, 'what', [134, 5, 'why', 'aha'])
(12, 'what', [134, 5, 'why', 'aha'])
(12, 'what', [134, 5, 'why', 'when'])
tup1的地址:1733721046760
tup2的地址:1733722320472'''

 

以上是我对这三个概念的理解如有不足请指正

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值