详解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 相关文章推荐
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
sublime text 3配置使用python操作方法
Jun 11 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python中property属性的介绍及其应用详解
Aug 29 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
Python 面向对象部分知识点小结
Mar 09 Python
Python实现AI换脸功能
Apr 10 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 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入门的学习方法
2007/01/02 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
PHP二维数组去重算法
2016/12/17 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
three.js 入门案例详解
2018/01/23 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
Python中断言Assertion的一些改进方案
2016/10/27 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
详解python多线程之间的同步(一)
2019/04/03 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Python修改列表值问题解决方案
2020/03/06 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
html5时钟实现代码
2010/10/22 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
会计职业生涯规划书
2014/01/13 职场文书
大学生社团活动总结
2014/04/26 职场文书
武当山导游词
2015/02/03 职场文书
火烧圆明园观后感
2015/06/03 职场文书
休假证明书
2015/06/24 职场文书