博客
关于我
list深拷贝和浅拷贝
阅读量:794 次
发布时间:2023-02-05

本文共 1449 字,大约阅读时间需要 4 分钟。

在Python中,经常需要对一个列表进行复制。关于复制,深拷贝与浅拷贝的区别在于:从原列表复制出的新列表是否会受到原列表的影响,即两个列表在内存中是否共享同一个区域。这一点是区分深拷贝和浅拷贝的关键。

接下来,我们将探讨Python中列表复制的几种方法,并分析它们是浅拷贝还是深拷贝。这对编程来说至关重要,因为理解这一点可以帮助我们避免错误,减少不必要的调试时间。

一、非拷贝方法——直接赋值

直接使用=赋值是非拷贝方法。这两个列表是等价的,修改其中任何一个列表都会直接影响到另一个列表。这体现了Python作为动态语言与C等静态语言在思想上的区别。

示例代码:

old = [1, [1, 2, 3], 3]new = oldprint('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:修改其中一个列表会直接影响到另一个列表。

二、浅拷贝的几种方法

1. copy()方法

old = [1, [1, 2, 3], 3]new = old.copy()print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:对于列表第一层实现了深拷贝,但对于嵌套的列表仍然是浅拷贝。

2. 使用列表生成式

old = [1, [1, 2, 3], 3]new = [i for i in old]print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。

3. 用for循环遍历

old = [1, [1, 2, 3], 3]new = []for i in range(len(old)):    new.append(old[i])print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。

4. 使用切片

old = [1, [1, 2, 3], 3]new = old[:]print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。

三、深拷贝的实现

如果需要无论多少层都实现深拷贝,可以使用deepcopy()方法。这种方法非常安全、高效且清爽。

示例代码:

import copyold = [1, [1, 2, 3], 3]new = copy.deepcopy(old)print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)

运行结果:修改新列表不会影响原列表,且嵌套的列表也实现了深拷贝。

转载地址:http://nkufk.baihongyu.com/

你可能感兴趣的文章
Linux网络带宽状态分析工具详解
查看>>
Linux网络管理工具:ifconfig,从入门到精通
查看>>
linux网络结构体
查看>>
linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO
查看>>
Linux网络编程常见面试题
查看>>
linux网络编程概念(一)
查看>>
Linux网络设备驱动 _驱动模型
查看>>
Linux网络配置与故障排除
查看>>
linux脚本执行报错:坏的解释器: 没有那个文件或目录
查看>>
Linux自主访问控制——有效ID与真实ID
查看>>
linux自动运行u盘上的脚本,脚本实现U盘自动挂载(linux)
查看>>
Linux自学笔记——openssh
查看>>
linux英英词典项目,五大主流英英词典(ESL)比较使用测评报告
查看>>
linux获取文件所在目录下,Linux_在Linux系统中获得文件所在目录名的方法,方式一:使用“ dirname“ - phpStudy...
查看>>
linux菜单无法编辑,gvim在linux下菜单无法显示问题
查看>>
Linux虚拟化网络之vlan配置实战
查看>>
Linux虚拟化网络之路由转发实战
查看>>
Linux虚拟机NAT模式设置静态IP并且能上网的设置方法
查看>>
Linux虚拟机上安装redis
查看>>
linux虚拟机配置静态网络,解决centos7网络异常,ping不通
查看>>