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 Trie树实现字典排序
Mar 28 Python
Python解析xml中dom元素的方法
Mar 12 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Django Celery异步任务队列的实现
Jul 24 Python
如何在python中写hive脚本
Nov 08 Python
python编写微信公众号首图思路详解
Dec 13 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
详解基于Scrapy的IP代理池搭建
Sep 29 Python
matplotlib对象拾取事件处理的实现
Jan 14 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代码
2010/07/17 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php验证手机号码
2015/11/11 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
python实现进程间通信简单实例
2014/07/23 Python
python实现多线程的两种方式
2016/05/22 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
python调试神器PySnooper的使用
2019/07/03 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python的dict判断key是否存在的方法
2020/12/09 Python
初中生三年学习生活的自我评价
2013/11/03 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
党员对照检查材料
2014/09/22 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
英文版辞职信
2015/02/28 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers