详解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二叉树遍历的实现方法
Nov 21 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
Python中enumerate函数代码解析
Oct 31 Python
python如何实现内容写在图片上
Mar 23 Python
Sanic框架流式传输操作示例
Jul 18 Python
对Python实现累加函数的方法详解
Jan 23 Python
机器学习实战之knn算法pandas
Jun 22 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
Python中Selenium库使用教程详解
Jul 23 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中多维数组的foreach遍历示例
2014/06/13 PHP
PHP合并静态文件详解
2014/11/14 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
python skimage 连通性区域检测方法
2018/06/21 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
用python解压分析jar包实例
2020/01/16 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
材料员岗位职责
2014/03/13 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
超市创业计划书
2014/09/15 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android