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 相关文章推荐
详细介绍Ruby中的正则表达式
Apr 10 Python
python爬取淘宝商品详情页数据
Feb 23 Python
PyCharm代码格式调整方法
May 23 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Python 2.7中文显示与处理方法
Jul 16 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
python读取Excel表格文件的方法
Sep 02 Python
python多线程并发及测试框架案例
Oct 15 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 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 静态化实现代码
2009/03/20 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
php操作xml
2013/10/27 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
50个比较实用jQuery代码段
2011/09/18 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
浅析python参数的知识点
2018/12/10 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
多媒体专业自我鉴定
2014/02/28 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
护理医院见习报告
2014/11/03 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书