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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python对列表排序的方法实例分析
May 16 Python
Python中 Lambda表达式全面解析
Nov 28 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
python 定时任务去检测服务器端口是否通的实例
Jan 26 Python
浅谈Python中(&,|)和(and,or)之间的区别
Aug 07 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python全栈开发语法总结
Nov 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
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
python用户管理系统的实例讲解
2017/12/23 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
使用Python更换外网IP的方法
2018/07/09 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
python3.4中清屏的处理方法
2020/07/06 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
python开根号实例讲解
2020/08/30 Python
css sprite简单实例
2016/05/23 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
企事业单位求职者的自我评价
2013/12/28 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
《悯农》教学反思
2014/04/28 职场文书
房屋出租委托书格式
2014/09/23 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server