python中【赋值】、【浅复制】、【深复制】的区别

python中【赋值】、【浅复制】、【深复制】的区别

相信很多同学是学到“浅复制”(浅拷贝)及“深复制”(深拷贝)这两个概念才来看本篇文章的,那我们不妨通过本篇文章来彻底的了解一下python中【赋值】、【浅复制】、【深复制】的区别。

1.赋值
【赋值】这个概念在学习python之初就已经很了解了,我们每每定义一个变量,都会给它进行【赋值】,那我们先看一下【赋值】的一些用法:

str1 = 'hopes'
print(type(str1))
print(str1)

结果:

<class 'str'>
hopes

我们首先定义了一个字符串变量,它的内容是"hopes",那接下来我们把‘str1’赋值给另一个字符串变量:

str1 = 'hopes'
str2 = str1

print(str1)
print(str2)

结果:

hopes
hopes

感觉这个【赋值】的效果跟【复制】是一样的,是真的一样吗?再体验下面的代码:

str1 = 'hopes'
str2 = str1

str1 = 'Li'

print(id(str1))
print(str1)

print(id(str2))
print(str2)

结果:

4309512688
Li

4309512368
hopes

看来确实是我们想要的【复制】效果,当我们定义‘str1’的时候,系统分配给了‘str1’一个内存空间,然后我们‘str1’赋值给‘str2’后,系统同样给‘str2’分配了一个内存空间,并且从此以后,‘str1’和‘str2’不再有任何关系,‘str1’无论怎样改变,都和‘str2’没有任何关系;所以【赋值】我们也可以将它看作是【复制】的一种。

2.浅复制
说完【赋值】,我们再聊一下【浅复制】,"浅"是深浅的浅,是浅层次的【复制】,那它的效果是怎样的呢?我们同样通过代码来观察:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.copy(list1)

print(list1)
print(list2)

list1.append(4)
print(list1)
print(list2)

结果:

[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2]]

[1, 2, 3, [1, 2], 4]
[1, 2, 3, [1, 2]]

观察效果后,感觉和直接【赋值】的方法是差不多的,我们将‘list1’【复制】给‘list2’之后,虽然改变了‘list1’的元素,但是‘list2’却没受影响;好,我们再看下一段代码,我们进行“深”一些的改变:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.copy(list1)

list1[3].append(4)
print(list1)
print(list2)

结果:

[1, 2, 3, [1, 2, 4]]
[1, 2, 3, [1, 2, 4]]

这里的结果就感觉不对了吧,很明显的看出,我们改变了更深一些的‘list1’里面的列表,从而也使‘list2’收到影响了,按理说【复制】之后他们两个应该互不影响才对吗?所以这个复制效果就是【浅复制】的性质;我们不妨看一下通过copy方法是否给‘list2’也分配内存空间了呢?

import copy
list1 = [1,2,3,[1,2,3]]
list2 = copy.copy(list1)   #浅复制

print(id(list1))
print(id(list2))

结果:

4489966400
4490147392

没问题,‘list1’和‘list2’都被分配了一个内存空间;以下三个方法都相当于【浅复制】:
1.使用切片[:]操作
2.使用工厂函数(如list/dir/set)
3.使用copy模块中的copy()函数

3.深复制
如果我们理解【浅复制】为:只是复制了浅层次的数据,更深层次的数据如果被修改,那么还是会受到影响的话,那么我们再看一下【深复制】有着怎样的效果:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.deepcopy(list1)    #深复制

print(list1)
print(list2)

list1.append(4)
print(list1)
print(list2)

结果:

[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2], 4]
[1, 2, 3, [1, 2]]

从上面的效果可以看出,在只修改浅层次的数据时,【深复制】和【浅复制】的效果是一样的,‘list2’均不会受到影响,那我们改一下深层次的数据试一下:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.deepcopy(list1)

list1[3].append(4)
print(list1)
print(list2)

结果:

[1, 2, 3, [1, 2, 4]]
[1, 2, 3, [1, 2]]

发现什么了吗?即使对‘list1’内部的列表进行更改,‘list2’还是不会受到影响;那我如果再深层次的改一下数据呢?

import copy
list1 = [1,2,3,[1,2,[2,3]]]
list2 = copy.deepcopy(list1)

list1[3][2].append(4)
print(list1)
print(list2)

结果:

[1, 2, 3, [1, 2, [2, 3, 4]]]
[1, 2, 3, [1, 2, [2, 3]]]

结果同样是没问题的,无论改多么深的数据,‘list2’都不会受到‘list1’的影响;【浅复制】和【深复制】的区别就是这么简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪博hopes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值