详解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文件写入实例分析
Apr 08 Python
Python实现二分查找算法实例
May 26 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Python多图片合并PDF的方法
Jan 03 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
python可以用哪些数据库
Jun 22 Python
python 判断文件或文件夹是否存在
Mar 18 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动态生成JavaScript代码
2009/03/09 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
php新建文件的方法实例
2019/09/26 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
Vue中图片Src使用变量的方法
2019/10/30 Javascript
如何高效使用Python字典的方法详解
2017/08/31 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
在python中实现对list求和及求积
2018/11/14 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
Python实现某论坛自动签到功能
2019/08/20 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
django在开发中取消外键约束的实现
2020/05/20 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
鸟的天堂导游词
2015/01/31 职场文书