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中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python使用代理ip访问网站的实例
May 07 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
python抓取搜狗微信公众号文章
Apr 01 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
python实现梯度下降法
Mar 24 Python
python 轮询执行某函数的2种方式
May 03 Python
python解决12306登录验证码的实现
Apr 18 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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中include与require使用方法区别详解
2013/10/19 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
php中动态调用函数的方法
2015/03/16 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
类似框架的js代码
2006/11/09 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
React实现轮播效果
2020/08/25 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
python logging.info在终端没输出的解决
2020/05/12 Python
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
办理护照工作证明
2014/10/10 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
教师读书活动心得体会
2016/01/14 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android