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 相关文章推荐
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
python pygame实现2048游戏
Nov 20 Python
pymongo中group by的操作方法教程
Mar 22 Python
Python datetime包函数简单介绍
Aug 28 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
Django框架表单操作实例分析
Nov 04 Python
python 装饰器功能与用法案例详解
Mar 06 Python
python实现udp聊天窗口
Mar 31 Python
运行Python编写的程序方法实例
Oct 21 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 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 加密与解密的斗争
2009/04/17 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
php 可变函数使用小结
2018/06/12 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python文件读取失败怎么处理
2020/06/23 Python
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
国贸专业自荐信范文
2014/03/02 职场文书
个人委托书格式
2014/04/04 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers