博客
关于我
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输入错误字符 删除显示^H和快速删除命令
查看>>
Linux运维之道之网络基础学习1.3
查看>>
linux运维实战练习-2015年9月01日课程作业(练习)安排
查看>>
Linux运维工程师必知的服务器备份工具:Rsnapshot
查看>>
Linux运维工程师必知:如何在 Linux 中使用网络命令netstat?
查看>>
Linux运维工程师必须要掌握的Docker命令,我给你整理好了!
查看>>
Linux运维必备!手把手教你搭建OpenFalcon监控系统
查看>>
Linux运维趋势
查看>>
Linux进程地址空间和虚拟内存
查看>>
Linux进程地址管理之mm_struct
查看>>
Linux进程堆栈状态分析实战
查看>>
Linux进程的实际用户ID和有效用户ID
查看>>
Linux进程管理实战指南:实用工具命令详解
查看>>
Linux进程间通信 - 共享内存
查看>>
Linux进程间通信——使用命名管道
查看>>
Linux进程间通信的秘密通道:IPC机制详解
查看>>
Linux远程连接wget、curl、scp命令详解
查看>>
linux递归参数-R(r)和-p的区别
查看>>
Linux通用应急响应脚本(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Linux逻辑卷管理实战
查看>>