python中对列表的复制操作(浅拷贝与深拷贝)

python中对列表的复制操作用的比较广泛,之前写过一篇博客Python:复制列表,禁止函数修改列表(副本,切片表示法[:])详细讲述了python中的 [:] 操作,但是 [:] 操作仅仅只是浅拷贝,具有很大的局限性。

一:[:] 浅拷贝操作

用法(path和num都是数组):

 path = num[:] 

如 path = num[:] 中,
path只会创建num的浅层副本,即只复制num中的元素的引用,而不会复制嵌套对象本身。
什么意思呢?简单举例来说:
如果num是一维数组的话,浅拷贝与深拷贝一样,对数组path怎样操作都影响不到数组num。

path修改元素(num值不变):
在这里插入图片描述

如果num是二维或二维以上的数组的话,path只会复制num数组的表面,如果修改path中的元素,原始列表num中的对应元素也会被修改。但是,如果你对path整体进行修改(例如path.append([3,3])),则不会影响原始列表num。

path修改元素(num也会改变):
在这里插入图片描述

path增加元素(num值不变):
在这里插入图片描述

所以 [:] 浅拷贝的缺陷很明显,一旦拷贝嵌套列表(二维及二维以上),对复制的列表进行修改操作会影响原列表,无法恢复。

二:copy()浅拷贝操作:

这里主要扩充一下copy()函数的知识点,copy()函数的用法是:path = num.copy()。

path = num.copy()

path = num.copy() 与 path = num[:] 操作一样

这种方式也是对列表进行浅拷贝操作。它会创建一个新的列表path,但是该列表中的元素依然是原始列表num中元素的引用。因此,和path = num[:]一样,对path中的元素的修改会影响原始列表num中的对应元素,但对path整体的修改不会影响原始列表num。

三:标准库函数copy.deepcopy() 深拷贝(蓝桥杯可用)

用法:

import copy

path = copy.deepcopy(num)

这种方式是对列表进行深拷贝操作。它会递归地复制原始列表num及其内部的所有对象,包括嵌套的列表、字典等。这样,创建的新列表path与原始列表num完全独立,对其中一个对象的修改不会影响另一个对象。深拷贝操作确保了复制后的对象与原始对象完全独立,是最安全的复制方式。

如图所示:
在这里插入图片描述

总结:

综上所述,path = num[:]和path = num.copy()是浅拷贝操作,会共享内部对象的引用,而path = copy.deepcopy(num)是深拷贝操作,会创建完全独立的副本。根据具体的需求,选择适合的复制方式来确保数据的安全性。

使用深拷贝就可以完美解决多维数组中对原数组的保留和修改问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不染_是非

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

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

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

打赏作者

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

抵扣说明:

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

余额充值