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使用bs4获取58同城城市分类的方法
Jul 08 Python
人机交互程序 python实现人机对话
Nov 14 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
对Python 数组的切片操作详解
Jul 02 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
Document 对象的常用方法
2009/07/31 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
PyCharm代码格式调整方法
2018/05/23 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
期末评语大全
2014/05/04 职场文书
工厂标语大全
2014/10/06 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
mysql配置SSL证书登录的实现
2021/09/04 MySQL
Java 在生活中的 10 大应用
2021/11/02 Java/Android