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实现FTP服务器服务的方法
Apr 11 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
Django发送邮件功能实例详解
Sep 02 Python
Python 经典算法100及解析(小结)
Sep 13 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
如何基于Python创建目录文件夹
Dec 31 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
pandas中对文本类型数据的处理小结
Nov 01 Python
Python3的进程和线程你了解吗
Mar 16 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的一些小问题
2010/07/03 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
PHP实现货币换算的方法
2014/11/29 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python读取csv文件示例(python操作csv)
2014/03/11 Python
python避免死锁方法实例分析
2015/06/04 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python实现PCA降维的示例详解
2020/02/24 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
党员公开承诺书内容
2014/05/20 职场文书
媒体宣传策划方案
2014/05/25 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python