详解Python的三种拷贝方式


Posted in Python onFebruary 11, 2020

在练习列表的操作的时候我发现赋值之后的列表会随着被赋值的列表改变而改变,就像是C语言中用指向同一实际变量的指针进行操作一样。这是因为Python中有三种拷贝方式:浅拷贝、深拷贝和赋值拷贝

赋值拷贝就像是定义新指针并指向了同一内存区域,对任意一个列表名进行操作,其他的也会变化。

深拷贝的作用是完全拷贝一个列表A并赋值给另一列表B。以下是深度拷贝与列表操作的样例。记得在使用深拷贝的时候要引入copy包。

import copy
 
#对列表的增删改
numbers_Ori = ['one', 'two', 'three', 'four']
print('origin')
print(numbers_Ori)
 
#deepcopy()是copy包里的方法,作用是将一个列表完全复制一份,赋值给指定新列表
#若只是用numbers = numbers_Ori来赋值则两个变量名将指向同一内存区域,修改任意一个后另一个也会随之变动
 
#增
numbers_2 = copy.deepcopy(numbers_Ori)
numbers_2.append('five')
print('append//////////////////')
print(numbers_2)
 
numbers_3 = copy.deepcopy(numbers_Ori)
numbers_3.insert(2, 'two and_a_half')
print('insert////////////////////')
print(numbers_3)
 
#删
numbers_4 = copy.deepcopy(numbers_Ori)
del numbers_4[2]
print('del///////////////////////')
print(numbers_4)
 
numbers_5 = copy.deepcopy(numbers_Ori)
num=numbers_5.pop(3)
print('pop////////////////////////')
print(numbers_5)
print('picked ' + num + ' up')
 
numbers_6 = copy.deepcopy(numbers_Ori)
numbers_6.remove('one')
print('remove/////////////////////')
print(numbers_6)
 
#改
numbers_7 = copy.deepcopy(numbers_Ori)
numbers_7[0] = '1'
print('改/////////////////////////')
print(numbers_7)
 
#可尝试将每一个"copy.deepcopy(numbers_Ori)"换成单独的"numbers_Ori"尝试赋值拷贝
#或换成"numbers_Ori.copy()"尝试浅拷贝

浅拷贝对于一维列表而言和深拷贝一样,而对于多维列表,修改B的一维内容时A不会变化;而修改高维内容时A也会随之变化,我们分别尝试在一维、二维和三维部分添加字符串

numbers = ['one', 'two', 'three', 'four', 'five', ['six', 'seven', ['eight', 'nine']]]
numbers_1 = numbers.copy()
numbers_1.append('add')#在一维列表的末尾添加字符串
print(numbers_1)
print(numbers)
numbers = ['one', 'two', 'three', 'four', 'five', ['six', 'seven', ['eight', 'nine']]]
numbers_1 = numbers.copy()
numbers_1[-1].append('add')#在二维列表的末尾添加字符串
print(numbers_1)
print(numbers)
numbers = ['one', 'two', 'three', 'four', 'five', ['six', 'seven', ['eight', 'nine']]]
numbers_1 = numbers.copy()
numbers_1[-1][-1].append('add')#在三维列表的末尾添加字符串
print(numbers_1)
print(numbers)

其中,numbers_1[-1]的意思是指定了numbers_1的最后一个元素,即二维部分"['six', 'seven', ['eight', 'nine']]",参数-1可以替换,但其他元素不是列表而是字符串,字符串不能append(),所以会报错;同理[-1][-1]就是三维部分"['eight', 'nine']",因为它是二维部分的最后一个元素。添加在末尾是因为使用了append(),而不是-1的原因。

总而言之,就是append()等列表操作必须对针对列表,就算是多维列表也要找出其中的列表元素才行。读者可以自行替换这些部分来进行试验。

总结

以上所述是小编给大家介绍的详解Python的三种拷贝方式,希望对大家有所帮助!

Python 相关文章推荐
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
Python3读取zip文件信息的方法
May 22 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
matplotlib subplots 设置总图的标题方法
May 25 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
解析Python3中的Import
Oct 13 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
Python小白不正确的使用类变量实例
May 29 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
Python @property原理解析和用法实例
Feb 11 #Python
如何使用Python发送HTML格式的邮件
Feb 11 #Python
python模式 工厂模式原理及实例详解
Feb 11 #Python
Python3搭建http服务器的实现代码
Feb 11 #Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 #Python
python线程join方法原理解析
Feb 11 #Python
使用Python求解带约束的最优化问题详解
Feb 11 #Python
You might like
关于文本留言本的分页代码
2006/10/09 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
PHP Session机制简介及用法
2014/08/19 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
项目实践之javascript技巧
2007/12/06 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
DOM 基本方法
2009/07/18 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
Python爬虫文件下载图文教程
2018/12/23 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
C语言笔试集
2012/07/24 面试题
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
室内设计专业个人的自我评价
2013/10/19 职场文书
文化产业实施方案
2014/06/07 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
详解MySQL的半同步
2021/04/22 MySQL
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS