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人人网登录应用实例
Sep 26 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
Python如何转换字符串大小写
Jun 04 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 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 cli 方式 在crotab中运行解决
2010/02/08 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
javascript prototype 原型链
2009/03/12 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
Python使用剪切板的方法
2017/06/06 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
拓展培训心得体会
2014/01/04 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书