详解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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
深入理解Python中的元类(metaclass)
Feb 14 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python pygame实现2048游戏
Nov 20 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python如何急速下载第三方库详解
Nov 02 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 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
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
APMServ使用说明
2006/10/23 PHP
php流量统计功能的实现代码
2012/09/29 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
vue-devtools的安装步骤
2018/04/23 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
python字符串连接方式汇总
2014/08/21 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python中bytes和str类型的区别
2019/10/21 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
学习python需要有编程基础吗
2020/06/02 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
shell的种类有哪些
2015/04/15 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
《风筝》教学反思
2014/04/10 职场文书
中等生评语大全
2014/05/04 职场文书
鉴定评语大全
2014/05/05 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫