Python的字典和列表的使用中一些需要注意的地方


Posted in Python onApril 24, 2015

Python 中有三个非常好用的数据结构,列表,元组和字典, 元组是不可变的,列表可以保存任意类型的Python对象,并可以随意扩展没有大小限制, 字典是一个key-value的键值映射的类型,可以存放任何Python对象,可以嵌套字典, 值可以是字典元组或者字典

这里说是Python 字典和列表的陷阱不如说是Python的一些特性,如果不了解这些特性 就会引发一些难以寻找的bug

下面我们来介绍这些特性

Python中所有对列表和字典的使用仅仅是对原来对象的引用而不是创建一个新的对象 如下面代码:

>>> info = dict(name='cold', blog='www.linuxzen.com') # 创建字典{'name':'cold', 'blog':'www.linuxzen.com'}
>>> info2 = info   # 赋值给info2
>>> info2['name'] = 'cold night'
>>> info
>>> info2
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> names = ['cold', 'night', 'linuxzen']
>>> names2 = names
>>> names2.append('cold night')
>>> names
['cold', 'night', 'linuxzen', 'cold night']
>>> names2
['cold', 'night', 'linuxzen', 'cold night']

大家看到如果将列表或者字典重新赋值给另外一个变量并没有达到预想的效果, 我们更改一个的同时另外一个也在同时更改,如果我们想保留一个快照,很明显我们 没有达到我们想要的效果,另外还有一种常见的使用,因为我们知道普通变量传递给 函数,函数在内部更改是不会影响到外部变量的,那么列表和字典呢? 我们来看如下代码,我们创建一个函数,是字典就添加一个键和值,是列表就在尾部添加一个元素

>>> def add_something(info):
...   if type(info) == dict:
...       info['msg'] = 'Hello,'+ info['name']
...   elif type(info) == list:
...       info.append('add to the list')
... 
>>> info = {'name':'cold', 'blog':'www.linuxzen.com'}
>>> add_something(info)
>>> info
{'blog': 'www.linuxzen.com', 'msg': 'Hello,cold', 'name': 'cold'}
>>> names = ['cold', 'night', 'linuxzen.com']
>>> add_something(names)
>>> names
['cold', 'night', 'linuxzen.com', 'add to the list']

如上代码明显不是我们想要的结果,如果这个列表/字典仅仅用在一个地方可能不会发生什么 如果我们其他地方需要同样的列表进行处理,如果你不知道这个特性就会产生很难寻找的bug 当上面并不是我们想要的我们该如何避免上面呢,我们可以对列表/字典做一个拷贝,而不是 简单的引用

>>> names = ['cold', 'night', 'linuxzen.com']
>>> names2 = names[:]
>>> names2.append('cold night')
>>> names
['cold', 'night', 'linuxzen.com']
>>> names2
['cold', 'night', 'linuxzen.com', 'cold night']
>>> info = {'name':'cold night', 'blog':'www.linuxzen.com'}
>>> info2 = info.copy()
>>> info2['name'] = 'cold'
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> info2
{'blog': 'www.linuxzen.com', 'name': 'cold'}

上面代码列表使用[:]可以创建一个列表的副本而不是引用 字典的copy方法同样可以创建一个字典的副本而不是引用 这样就可以避免之前所说的引用的情况

Python 相关文章推荐
Python修改Excel数据的实例代码
Nov 01 Python
python益智游戏计算汉诺塔问题示例
Mar 05 Python
Python格式化css文件的方法
Mar 10 Python
Python自定义线程池实现方法分析
Feb 07 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
python实现反转部分单向链表
Sep 27 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
wxPython实现文本框基础组件
Nov 18 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
Python自动化操作实现图例绘制
Jul 09 Python
整理Python最基本的操作字典的方法
Apr 24 #Python
编写Python脚本使得web页面上的代码高亮显示
Apr 24 #Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 #Python
Python3.x中自定义比较函数
Apr 24 #Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 #Python
Python3.x版本中新的字符串格式化方法
Apr 24 #Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 #Python
You might like
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python实现屏保计时器的示例代码
2018/08/08 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
党员自我评价分享
2013/12/13 职场文书
交通志愿者活动总结
2014/06/27 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
商家认证委托书格式
2014/10/16 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
python多次执行绘制条形图
2022/04/20 Python