详解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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
在Docker上部署Python的Flask框架的教程
Apr 08 Python
Python中编写ORM框架的入门指引
Apr 29 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
python 动态加载的实现方法
Dec 22 Python
PyQt实现界面翻转切换效果
Apr 20 Python
Python 通过打码平台实现验证码的实现
May 13 Python
python中的句柄操作的方法示例
Jun 20 Python
python实现超市管理系统(后台管理)
Oct 25 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 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获取中文拼音首字母类和函数分享
2014/04/24 PHP
php实现用户登陆简单实例
2017/04/04 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
原生javascript如何实现共享onload事件
2020/07/03 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Django验证码的生成与使用示例
2017/05/20 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
python实现多层感知器
2019/01/18 Python
详解Python3中ceil()函数用法
2019/02/19 Python
详解Python的三种可变参数
2019/05/08 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技