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中from module import * 的一个坑
Jul 20 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
Python实现的RSS阅读器实例
Jul 25 Python
Python使用gensim计算文档相似性
Apr 10 Python
wxPython之解决闪烁的问题
Jan 15 Python
python实现简单遗传算法
Mar 19 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
python实现数据库跨服务器迁移
Apr 12 Python
对Python中内置异常层次结构详解
Oct 18 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
Python生成器常见问题及解决方案
Mar 21 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
php中namespace use用法实例分析
2016/01/22 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
python简单程序读取串口信息的方法
2015/03/13 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
python实现手机销售管理系统
2019/03/19 Python
树莓派实现移动拍照
2019/06/22 Python
浅析PEP572: 海象运算符
2019/10/15 Python
django实现后台显示媒体文件
2020/04/07 Python
用python批量移动文件
2021/01/14 Python
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python