详解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使用xmlrpc实例讲解
Dec 17 Python
python输出指定月份日历的方法
Apr 23 Python
为Python程序添加图形化界面的教程
Apr 29 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
详解js文件通过python访问数据库方法
Mar 03 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
Python缓存技术实现过程详解
Sep 25 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python判断all函数输出结果是否为true的方法
Dec 03 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
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
python实现发送和获取手机短信验证码
2016/01/15 Python
深入理解Python中的内置常量
2017/05/20 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
会话Bean的种类
2013/11/07 面试题
学习委员自我鉴定
2014/01/13 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
资金申请报告范文
2015/05/14 职场文书
法人身份证明书
2015/06/18 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
Python实现信息管理系统
2022/06/05 Python