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 re模块介绍
Nov 30 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
python线程定时器Timer实现原理解析
Nov 30 Python
打包PyQt5应用时的注意事项
Feb 14 Python
150行Python代码实现带界面的数独游戏
Apr 04 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 session_start()问题解疑(详细介绍)
2013/07/05 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
javascript 新浪背投广告实现代码
2009/07/07 Javascript
web前端开发也需要日志
2010/12/09 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
vue页面离开后执行函数的实例
2018/03/13 Javascript
vue实现购物车小案例
2019/09/27 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
python控制台英汉汉英电子词典
2020/04/23 Python
Python中的自省(反射)详解
2015/06/02 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
Python识别验证码的实现示例
2020/09/30 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
结婚典礼证婚词
2014/01/11 职场文书
数控个人求职信范文
2014/02/03 职场文书
旅游活动总结
2014/08/27 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
勤俭节约主题班会
2015/08/13 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Python实现抖音热搜定时爬取功能
2022/03/16 Python
python使用shell脚本创建kafka连接器
2022/04/29 Python