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获取apk文件URL地址实例
Nov 01 Python
Python中logging模块的用法实例
Sep 29 Python
python使用socket连接远程服务器的方法
Apr 29 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
Python中常见的异常总结
Feb 20 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
在Python中定义一个常量的方法
Nov 10 Python
python中几种自动微分库解析
Aug 29 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
python语言中有算法吗
Jun 16 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
python小程序之飘落的银杏
Apr 17 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
基于PHP微信红包的算法探讨
2016/07/21 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP7 windows支持
2021/03/09 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
JS变量及其作用域
2017/03/29 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python中实现switch功能实例解析
2018/01/11 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
以下的初始化有什么区别
2013/12/16 面试题
实习单位推荐信范文
2013/11/27 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
交通安全横幅标语
2014/10/07 职场文书
2015元旦节寄语
2014/12/08 职场文书
旅游安全责任协议书
2016/03/22 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
Pandas数据类型之category的用法
2021/06/28 Python
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python