当前位置: 首页 > article >正文

【学习笔记】python仅拷贝list的值,引出浅拷贝与深拷贝

一、python 仅拷贝list的值(来源于gpt)
在 Python 中,可以使用切片或 copy() 方法来仅拷贝列表的值。

1、使用切片
a = [1, 2, 3, 4, 5]
b = a[:] # 通过切片来拷贝 a 的值
在上面的代码中,我们使用切片来拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

2、使用 copy() 方法
a = [1, 2, 3, 4, 5]
b = a.copy() # 通过 copy() 方法来拷贝 a 的值
在上面的代码中,我们使用列表的 copy() 方法来拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

需要注意的是,如果列表中的元素是可变对象(如列表、字典等),则使用切片或 copy() 方法仅拷贝了对象的引用,而不是对象本身。这意味着,如果修改了拷贝后的列表中的可变对象,原列表中对应的元素也会发生改变。

如果要深度拷贝一个列表,可以使用 copy.deepcopy() 方法,示例如下:
import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a) # 深度拷贝 a 的值
b[0][0] = 0 # 修改 b 中的元素
print(a) # 输出:[[1, 2], [3, 4]]
print(b) # 输出:[[0, 2], [3, 4]]
在上面的代码中,我们使用 copy.deepcopy() 方法来深度拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

二、浅拷贝与深拷贝

直接赋值:其实就是对象的引用(别名)。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

在这里插入图片描述
c的结果为什么不等于a:
在上面的代码中,c = copy.copy(a) 是浅拷贝,它只会拷贝 a 的一层对象,而不会拷贝 a 中嵌套的可变对象(如列表 [‘a’, ‘b’])。因此,当修改 a 中嵌套的可变对象时,c 中对应的元素也会发生变化。

具体来说,在修改 a 中的 [‘a’, ‘b’] 数组对象后,c 中对应的元素也发生了变化,因为 c 和 a 中都引用了同一个 [‘a’, ‘b’] 数组对象。而 b 和 a 相等,因为 b 和 a 指向了同一个对象。

如果想要避免这种情况,可以使用 copy.deepcopy() 方法进行深度拷贝,这样可以拷贝整个对象,包括嵌套的可变对象。

三、练习的代码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/161976.html

相关文章:

  • 【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组
  • 【自用】0-1背包问题与完全背包问题的Java实现
  • 假期增设:福祉与负担并存,寻求生活经济平衡之道
  • 如何查看电脑关机时间
  • 怎么监控员工电脑?分享5个监控员工电脑的绝佳方法(立竿见影!建议收藏!)
  • void * 指针与整数进行加减运算
  • 在Python中,*f和**f是用于解包参数的语法
  • linux安装mysql5.7(一遍过)
  • 案例060:基于微信小程序考试系统
  • Java 简易版 UDP 多人聊天室
  • ThinkPHP插件开发实例
  • vue 使用 h函数
  • 区块链optimism主网节点搭建
  • 2024年值得关注的8个未来数据库
  • 什么是https 加密协议?
  • Javaweb之Maven仓库的详细解析
  • RPC 集群,gRPC 广播和组播
  • ELK架构监控MySQL慢日志
  • git-vscode
  • ubuntu20.04设置开机自启动jar(依赖其他服务)
  • 简单介绍一些其他的树
  • 阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜
  • 【教程】逻辑回归怎么做多分类
  • 转转闲鱼链接后台搭建教程+完整版源码
  • 上海市青少年算法2022年10月月赛(乙组)
  • 【BUG】SpringBoot项目Long类型数据返回前端精度丢失问题