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 的 with 语句详解
Jun 13 Python
Python文件读取的3种方法及路径转义
Jun 21 Python
python编写Logistic逻辑回归
Dec 30 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
python版本单链表实现代码
Sep 28 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
自学python的建议和周期预算
Jan 30 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
TensorFlow实现自定义Op方式
Feb 04 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
python删除文件、清空目录的实现方法
Sep 23 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 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与C#分别格式化文件大小的代码
2011/05/14 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
tensorflow输出权重值和偏差的方法
2018/02/10 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
毕业生就业自荐书
2013/12/15 职场文书
租车协议书范本
2014/04/22 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
工人先锋号申报材料
2014/12/29 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书