详解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 16 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Python制作数据导入导出工具
Jul 31 Python
Python使用functools实现注解同步方法
Feb 06 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
基于python生成器封装的协程类
Mar 20 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
python多线程扫描端口(线程池)
Sep 04 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
python中sympy库求常微分方程的用法
Apr 28 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 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中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
python实现手机销售管理系统
2019/03/19 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
python中xlutils库用法浅析
2020/12/29 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
Born鞋子官网:Born Shoes
2017/04/06 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
蛋糕店的商业计划书范文
2014/01/27 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
党性分析自查总结
2014/10/14 职场文书
超市员工管理制度
2015/08/06 职场文书
个人售房合同协议书
2016/03/21 职场文书