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 应用中使用 MongoDB的方法
Jan 05 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
详解Python map函数及Python map()函数的用法
Nov 16 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
python中HTMLParser模块知识点总结
Jan 25 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
Python-基础-入门 简介
2014/08/09 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python中的heapq模块源码详析
2019/01/08 Python
python创造虚拟环境方法总结
2019/03/04 Python
浅析python 字典嵌套
2020/09/29 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
40岁生日感言
2014/02/15 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
美术教师个人工作总结
2015/02/06 职场文书
公司聚餐通知
2015/04/22 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python