详解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监控文件内容变化代码实例
Jun 04 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
Python发展史及网络爬虫
Jun 19 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
python读取Kafka实例
Dec 23 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
python 3.8.3 安装配置图文教程
May 21 Python
Python定义一个函数的方法
Jun 15 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
Symfony生成二维码的方法
2016/02/04 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Django中login_required装饰器的深入介绍
2017/11/24 Python
python实现中文文本分句的例子
2019/07/15 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
2014全国两会心得体会
2014/03/17 职场文书
新党章的学习心得体会
2014/11/07 职场文书
五年级语文教学反思
2016/03/03 职场文书
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android