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 常用string函数详解
May 30 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
pandas中的series数据类型详解
Jul 06 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
如何利用Python写个坦克大战
Nov 18 Python
Python turtle编写简单的球类小游戏
Mar 31 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
php获取根域名方法汇总
2014/10/28 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
2015新年寄语大全
2014/12/08 职场文书
送达通知书
2015/04/25 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
创业计划书之物流运送
2019/09/17 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书