详解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的Flask框架中实现单元测试的教程
Apr 20 Python
Python使用django获取用户IP地址的方法
May 11 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
django序列化serializers过程解析
Dec 14 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Python连续赋值需要注意的一些问题
Jun 03 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
vue中的inject学习教程
2019/04/24 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
详解Python中dict与set的使用
2015/08/10 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
python安装教程
2018/02/28 Python
python K近邻算法的kd树实现
2018/09/06 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python字典改变value值方法总结
2019/06/21 Python
用python解压分析jar包实例
2020/01/16 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
意大利团购网站:Groupon意大利
2016/10/11 全球购物
护理专业大学生自我推荐信
2014/01/25 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
竞选学委演讲稿
2014/09/13 职场文书
继承公证书格式
2015/01/26 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
罚款通知怎么写
2015/04/22 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript