详解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中的Numpy入门教程
Apr 26 Python
详解Python中for循环的使用方法
May 14 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python执行时间的计算方法小结
Mar 17 Python
浅析python递归函数和河内塔问题
Apr 18 Python
matplotlib设置legend图例代码示例
Dec 19 Python
Python 类的特殊成员解析
Jun 20 Python
python实现将汉字保存成文本的方法
Nov 16 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
javascript模拟命名空间
2015/04/17 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
python逆向入门教程
2018/01/15 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
YUV转为jpg图像的实现
2019/12/09 Python
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
优秀老员工获奖感言
2014/02/15 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
小学节能减排倡议书
2014/05/15 职场文书
党员承诺书格式
2014/05/21 职场文书
自主招生英文自荐信
2015/03/25 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书