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基础教程项目三之万能的XML
Apr 02 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
python 实现两个npy档案合并
Jul 01 Python
使用Python操作MySQL的小技巧
Sep 10 Python
SpringBoot首页设置解析(推荐)
Feb 11 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
10 个经典PHP函数
2013/10/17 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
Python实现字符串匹配算法代码示例
2017/12/05 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
django自定义模板标签过程解析
2019/12/14 Python
python Tensor和Array对比分析
2020/01/08 Python
python计算导数并绘图的实例
2020/02/29 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
汇科协同Java笔试题
2012/03/31 面试题
村长贪污检举信
2014/04/04 职场文书
电台编导求职信
2014/05/06 职场文书
最美护士演讲稿
2014/08/27 职场文书
单位委托书
2014/10/15 职场文书
2015年教学工作总结
2015/04/02 职场文书
龙猫观后感
2015/06/09 职场文书