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实例分享:快速查找出被挂马的文件
Jun 08 Python
python中OrderedDict的使用方法详解
May 05 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
python 显示数组全部元素的方法
Apr 19 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
Python读取JSON数据操作实例解析
May 18 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 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
德生S2000电路分析
2021/03/02 无线电
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
javascript实现扫雷简易版
2020/08/18 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
使用Pycharm分段执行代码
2020/04/15 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
Java文件和目录(IO)操作
2014/08/26 面试题
环保倡议书怎么写
2014/05/16 职场文书
校庆活动策划方案
2014/06/05 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
投资意向协议书
2015/01/29 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby