Python中赋值拷贝、浅拷贝与深拷贝的区别

在Python中赋值拷贝、浅拷贝与深拷贝的区别

在python中有的三种对于对象的赋值方式,赋值、深浅拷贝,那么他们有什么样的不同点。下面我们就来聊聊。-----仅属于个人观点
一、赋值
说实在的,在python中,对象的赋值就是对于对象的引用。不废话上代码。

list =[1,2,3,4,5]
list2=list
print(list)
print(id(list))
print(list2)
print(id(list2))

在这里插入图片描述
由上述代码可知,只是将列表list改变了一个名字,叫做list2,也可以称之为对于对象的引用,当修改了list的值的时候,那么list2的值也将修改自动与list同步。
二、浅拷贝
在Python中常见的浅拷贝的三种形式:切片操作、工厂函数、copy 模块中的 copy 函数
那么我就说一说这三种操作形式:
(1)切片操作

import copy
a=(1,2,3,4,5,['q','w','e','r'])
b=a[:]
b[5][3]='t'
print(a)
print(b)

结果截图
浅拷贝结果
(2)工厂函数

import copy
a0=['q','w','e','r']
a=[1,'q',3,4,5,a0]
b = list(a)
b[1] = 'a'
print(a)
print(b)

结果截图
在这里插入图片描述
(3)copy函数

import copy
a0=['q','w','e','r']
a=[1,'q',3,4,5,a0]
b = copy.copy(a)
b[1] = 'a'
print(a)
print(b)

结果截图:
在这里插入图片描述
看了这么多的代码有没有发现这三种形式不同的地方,其实所谓切片操作、工厂函数、与copy函数不同的地方在于,其复制操作的代码以上的代码,并没有让你看到浅拷贝与普通复制的不同之处。那么下面这一例代码会告诉你,它的不同。

import copy 
L0 = ['a', 'b', 'c'] 
L1 = [1, 2, 3, L0] 
print(L1)  
L1_copy1 = copy.copy(L1) 
L1_copy2 = L1.copy()  
L1[1] = 4  
L0[1] = 'h'  
print(L1_copy1) 
print(L1_copy2) 

看完这些代码你可能认为L1_copy1与L1_copy2的值相同,事实上,当我说出上面那句话的时候。你应该就猜出来了,对这两个值是相同的,但是我所谓相同出来的结果可能与你所想有些不同。上截图:
在这里插入图片描述
怎么样是不是与想象的有一些差距,对,这就是浅拷贝,最内层会被改变,而外层不会改变,这就是浅层拷贝。

(3)深拷贝
浅拷贝知道了之后,那么深拷贝也就那么一回事儿,在pyhton中,函数deepcopy(),用来做深拷贝。

import copy 
L0 = ['a', 'b', 'c'] 
L1 = [1, 2, 3, L0] 
print(L1) 
L1_1 = copy.deepcopy(L1) 
L1[1] = 4 
L0[1] = 'h' 
print(L1_1)

结果截图:
在这里插入图片描述
如你看到的,答案中L1_1与L1完全一样,这说明,其实深拷贝就是将其复制放到与源码不同的地址上去,那么无论怎么改变原来的数据,复制好的数据不会再次改变。

上面的一些代码是复制于
https://blog.csdn.net/weixin_45126194/article/details/93382836

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值