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 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
python实现文件名批量替换和内容替换
Mar 20 Python
python optparse模块使用实例
Apr 09 Python
python实现实时监控文件的方法
Aug 26 Python
详解python之配置日志的几种方式
May 22 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
详解Django定时任务模块设计与实践
Jul 24 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 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
MVC模式的PHP实现
2006/10/09 PHP
php共享内存段示例分享
2014/01/20 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
Python 3.8 新功能全解
2019/07/25 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
小学生学雷锋演讲稿
2014/04/25 职场文书
养成教育经验材料
2014/05/26 职场文书
大学生学年个人总结
2015/02/15 职场文书
2016新年慰问信范文
2015/03/25 职场文书
房屋质量投诉书
2015/07/02 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis