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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
Python脚本实现虾米网签到功能
Apr 12 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
python编写Logistic逻辑回归
Dec 30 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
使用pytorch实现线性回归
Apr 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
PHP的拦截器实例分析
2014/11/03 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
Python-基础-入门 简介
2014/08/09 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
django中静态文件配置static的方法
2018/05/20 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
使用django实现一个代码发布系统
2019/07/18 Python
基于Python fminunc 的替代方法
2020/02/29 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
上海微创软件面试题
2012/06/14 面试题
法律专业实习鉴定
2013/12/22 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
省三好学生申请材料
2014/01/22 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
法制宣传月活动总结
2014/04/29 职场文书
推荐信格式要求
2014/05/09 职场文书
婚前协议书范本
2014/10/27 职场文书
司机个人年终总结
2015/03/03 职场文书
MySQL创建管理HASH分区
2022/04/13 MySQL