详解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计算回文数的方法
Mar 11 Python
python生成随机mac地址的方法
Mar 16 Python
jupyter安装小结
Mar 13 Python
python字符串中的单双引
Feb 16 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
Python调用C语言的实现
Jul 26 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
将数据集制作成VOC数据集格式的实例
Feb 17 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
tensorflow中的数据类型dtype用法说明
May 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 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
django的model操作汇整详解
2019/07/26 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
校园演讲稿汇总
2014/05/21 职场文书
中国梦口号
2014/06/13 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
MySQL 语句执行顺序举例解析
2022/06/05 MySQL