详解Python列表赋值复制深拷贝及5种浅拷贝


Posted in Python onMay 15, 2019

概述

在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用呢?

列表赋值

# 定义一个新列表
l1 = [1, 2, 3, 4, 5]
# 对l2赋值
l2 = l1
print(l1)
l2[0] = 100
print(l1)

示例结果:

[1, 2, 3, 4, 5]
[100, 2, 3, 4, 5]

可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的“复制”,在Python中,列表属于可变对象,而对可变对象的复制其实就是将列表的内存空间类似C中的指针再次指向新的变量名,而不是诸如字符串这种不可变对象在复制时会创建新的内存空间进行赋值。即此时L1和L2指向的是同一片内存空间,那么怎么实现真正复制呢?

浅拷贝

当列表中的元素为不可变对象时,我们可以用以下方法对列表进行赋值:

import copy
# 定义一个新列表
L0 = [1, 2, 3, 4, 5]
print(L0)
print('-'*40)

利用切片

L1 = L0[:]
L1[0] = 100
print(L0)

利用模块copy

import copy
L2 = copy.copy(L0)
L2[0] = 100
print(L0)

利用list()

L3 = list(L0)
L3[0] = 100
print(L0)

利用列表方法extend

L4 = []
L4.extend(L0)
L4[0] = 100
print(L0)

利用列表推导

L5 = [i for i in L0]
L5[0] = 100
print(L0)

可以看到最终的打印结果都是[1, 2, 3, 4, 5],我们成功进行了列表的复制,但是为了条件需要是列表中元素为不可变对象呢? 因为如果列表中的元素为可变对象,在复制时有会发生对象的引用,而不是新建内存空间进行引用,比如:

L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = L0[:]
L2[2][0] = 100
print(L0)

示例结果:

[1, 2, [3], 4, 5]
[1, 2, [100], 4, 5]

可以看到,当列表L0中含有可变对象时,对复制后的L1进行改变其中可变对象元素L2[2]时,L0中的可变对象L0[2]也发生了改变,那么怎么实现真正的完全的拷贝呢?

深拷贝

利用copy模块中的deepcopy进行深拷贝:

import copy
L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = copy.deepcopy(L0)
L2[2][0] = 100
print(L2)
print(L0)

示例结果:

[1, 2, [100], 4, 5]
[1, 2, [3], 4, 5]

总结

以上所述是小编给大家介绍的详解Python列表赋值复制深拷贝及5种浅拷贝,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python 查找文件夹下所有文件 实现代码
Jul 01 Python
使用Python脚本操作MongoDB的教程
Apr 16 Python
Python类属性与实例属性用法分析
May 09 Python
用Python抢过年的火车票附源码
Dec 07 Python
Django实现学生管理系统
Feb 26 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
Python循环之while无限迭代
Apr 30 Python
Python 20行简单实现有道在线翻译的详解
May 15 #Python
Python中的字符串切片(截取字符串)的详解
May 15 #Python
python3 property装饰器实现原理与用法示例
May 15 #Python
详解Python下载图片并保存本地的两种方式
May 15 #Python
Python常用模块之requests模块用法分析
May 15 #Python
Django框架实现的普通登录案例【使用POST方法】
May 15 #Python
Django框架使用mysql视图操作示例
May 15 #Python
You might like
PHP脚本的10个技巧(5)
2006/10/09 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
javascript定时保存表单数据的代码
2011/03/17 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
浅谈Python的异常处理
2016/06/19 Python
python flask 多对多表查询功能
2017/06/25 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
python zip()函数的使用示例
2020/09/23 Python
环境科学专业研究生求职信
2013/10/02 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
党支部书记岗位职责
2015/02/15 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
PYTHON InceptionV3模型的复现详解
2022/05/06 Python