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浅拷贝与深拷贝用法实例
May 09 Python
Python实现的购物车功能示例
Feb 11 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
python字符串中匹配数字的正则表达式
Jul 03 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
python两种获取剪贴板内容的方法
Nov 06 Python
图文详解matlab原始处理图像几何变换
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网页显示各种语法错误
2013/09/23 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Python将string转换到float的实例方法
2019/07/29 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
详解Python self 参数
2019/08/30 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
俄罗斯儿童和青少年服装、鞋子及配件的在线商店:Orby
2020/02/20 全球购物
财务会计人员求职的自我评价
2014/01/13 职场文书
2014年班组工作总结
2014/11/20 职场文书
销售助理岗位职责
2015/02/11 职场文书
新闻稿格式范文
2015/07/18 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
java调用Restful接口的三种方法
2021/08/23 Java/Android
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python
ipad隐藏软件app图标方法
2022/04/19 数码科技