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实现数据图表
Jul 29 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Python socket实现简单聊天室
Apr 01 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
ubuntu上安装python的实例方法
Sep 30 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 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
神族 Protoss 历史背景
2020/03/14 星际争霸
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
JavaScript 学习 - 提高篇
2007/02/02 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
详解python的几种标准输出重定向方式
2016/08/15 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
英国著名书店:Foyles
2018/12/01 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
师范生自我鉴定范文
2013/10/05 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
销售经理竞聘书
2014/03/31 职场文书
行政主管岗位职责
2015/02/03 职场文书
项目合作意向书
2015/05/08 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
Golang 入门 之url 包
2022/05/04 Golang