详解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读文件逐行处理的示例代码分享
Dec 27 Python
python中使用序列的方法
Aug 03 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
深入理解Python中变量赋值的问题
Jan 12 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
python 调整图片亮度的示例
Dec 03 Python
Python爬虫回测股票的实例讲解
Jan 22 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
PHP define函数的使用说明
2008/08/27 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
解析php中的escape函数
2013/06/29 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
js中数组Array的一些常用方法总结
2013/08/12 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python验证码识别的实例详解
2016/09/09 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
详解Python传入参数的几种方法
2019/05/16 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
自荐信要包含哪些内容
2013/11/06 职场文书
医学类个人求职信范文
2014/02/05 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
永远是春天观后感
2015/06/12 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android