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牛刀小试密码爆破
Feb 03 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python动态参数用法实例分析
May 25 Python
python获取外网ip地址的方法总结
Jul 02 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
Python中的TCP socket写法示例
May 11 Python
python的debug实用工具 pdb详解
Jul 12 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
python实现飞行棋游戏
Feb 05 Python
Python进行统计建模
Aug 10 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添加数据到xml文件的简单例子
2016/09/08 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
numpy排序与集合运算用法示例
2017/12/15 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Python序列类型的打包和解包实例
2019/12/21 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
医院总经理职责
2013/12/26 职场文书
简短证婚人证婚词
2014/01/09 职场文书
优秀公益广告词大全
2014/03/19 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书