Python字典深浅拷贝与循环方式方法详解


Posted in Python onFebruary 09, 2020

本节内容

  • 深浅拷贝
  • 循环方式
  • 字典常用方法总结

一、深浅拷贝

列表、元组、字典(以及其他)

对于列表、元组和字典而言,进行赋值(=)、浅拷贝(copy)、深拷贝(deepcopy)而言,其内存地址是变化不通的。

赋值(=)

赋值只是创建一个变量,该变量指向原来的内存地址

>>> name1 = ['a','b',['m','n'],'c']
>>> name2 = name1
#输出结果,两个内存地址是一样的
>>> print(id(name1),',',id(name2))
50077256 , 50077256

 如图所示:

Python字典深浅拷贝与循环方式方法详解

 浅拷贝(copy)

浅拷贝是指在内存地址中,只拷贝出第一层的内存的地址,所以拷贝变量和被拷贝变量的内存地址是不一样的(列表、元组和字典中的copy()方法都是浅拷贝)

>>> import copy
>>> name1 = ['a','b',['m','n'],'c']
#浅copy
>>> name2 = copy.copy(name1)
>>> print(name1,',',id(name1))
['a', 'b', ['m', 'n'], 'c'] , 50228296
>>> print(name2,',',id(name2))
['a', 'b', ['m', 'n'], 'c'] , 50920008
#修改列表中的元素
>>> name1[0] = 'h'
>>> name1[2][0] = 'M'
>>> print(name1,',',id(name1))
['h', 'b', ['M', 'n'], 'c'] , 50228296
>>> print(name2,',',id(name2))
['a', 'b', ['M', 'n'], 'c'] , 50920008

 如图所示:

Python字典深浅拷贝与循环方式方法详解

注:因为浅拷贝只拷贝了第一层,所以拷贝的变量和被拷贝的变量的第二层的列表的内存地址是一样的。

>>> import copy
>>> name1 = ['a','b',['m','n'],'c']
>>> name2 = copy.copy(name1)
>>> name1[0] = 'h'
>>> name1[2][0] = 'M'
#name1[2][0]的内存地址和name2[2][0]内存地址是一样的
>>> print(name1,id(name1),id(name1[2][0]))
['h', 'b', ['M', 'n'], 'c'] 50209800 13820904
>>> print(name2,id(name2),id(name2[2][0]))
['a', 'b', ['M', 'n'], 'c'] 50891144 13820904

浅拷贝的三种表现形式:

1.用copy模块中的copy方法(跟上面的一样)

2.用切片的方式:

>>> name1 = ['a','b',['m','n'],'c']
>>> name2 = name1[:]

 3.用列表自带的方法:

>>> name1 = ['a','b',['m','n'],'c']
>>> name2 = name1.copy()

深拷贝(deepcopy)

深拷贝是指在内存中将所有的数据重新创建一份。

注:排除最后一层,即python内部对字符串和数字的优化

>>> import copy
>>> name1 = ['a','b',['m','n'],'c']
#深拷贝
>>> name2 = copy.deepcopy(name1)
>>> print(name1,',',id(name1))
['a', 'b', ['m', 'n'], 'c'] , 50142472
>>> print(name2,',',id(name2))
['a', 'b', ['m', 'n'], 'c'] , 50942280
>>> name1[0] = 'h'
>>> name1[2][0] = 'M'
>>> print(name1,id(name1),id(name1[2][0]))
['h', 'b', ['M', 'n'], 'c'] 50142472 10937320
>>> print(name2,id(name2),id(name2[2][0]))
['a', 'b', ['m', 'n'], 'c'] 50942280 4896280

 如图所示:

Python字典深浅拷贝与循环方式方法详解

 注:因为深拷贝会拷贝到最后一层的内存地址,所以最后一层的内存地址是不通

二、循环方式

方法1、

for key in info:
  print(key,info[key])

 方法2、

for k,v in info.items(): #会先把dict转成list,数据量大时莫用
  print(k,v)

 小结:

①方法1的效率比方法2的效率高很多

②方法1是直接通过key取value

③方法2是先把字典转换成一个列表,再去取值

④当数据量比较大的时候,用第二种方法时,字典转换成列表的这个过程需要花大量的时间老转换,当然数据量不大,没有关系,效率差不多

字典常用方法

Python字典深浅拷贝与循环方式方法详解

更多关于Python字典深浅拷贝与循环方式方法请查看下面的相关链接

Python 相关文章推荐
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
详解python itertools功能
Feb 07 Python
Python求凸包及多边形面积教程
Apr 12 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
python如何停止递归
Sep 09 Python
Python高并发和多线程有什么关系
Nov 14 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
python爬取某网站原图作为壁纸
Jun 02 Python
Python文件操作方法详解
Feb 09 #Python
Python列表操作方法详解
Feb 09 #Python
Python2与Python3的区别详解
Feb 09 #Python
python默认参数调用方法解析
Feb 09 #Python
Python集合操作方法详解
Feb 09 #Python
Python字符编码转码之GBK,UTF8互转
Feb 09 #Python
Python基础之字符串操作常用函数集合
Feb 09 #Python
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
DOMXML函数笔记
2006/10/09 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
Javascript base64编码实现代码
2011/12/02 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
什么是接口(Interface)?
2013/02/01 面试题
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
信息技术培训感言
2014/03/06 职场文书
超市中秋节促销方案
2014/03/21 职场文书
高一新生军训方案
2014/05/12 职场文书
关于爱国的标语
2014/06/24 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
消防安全培训工作总结
2015/10/23 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
浅谈Python魔法方法
2021/06/28 Java/Android
Java实现聊天机器人完善版
2021/07/04 Java/Android