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写的一个文本编辑器
Jan 23 Python
django实现分页的方法
May 26 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
使用python接入微信聊天机器人
Mar 31 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
Django实现文件上传和下载功能
Oct 06 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
pytorch训练神经网络爆内存的解决方案
May 22 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操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
python操作redis数据库的三种方法
2020/09/10 Python
python切割图片的示例
2020/11/12 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
五一手机促销方案
2014/03/08 职场文书
法院授权委托书格式
2014/09/28 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
党员公开承诺书2015
2015/01/21 职场文书
感谢信的格式
2015/01/21 职场文书
三下乡个人总结
2015/03/04 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
关爱空巢老人感想
2015/08/11 职场文书
Python基础之条件语句详解
2021/06/16 Python
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL