python编程细节──遍历dict的两种方法比较
浏览:18984次 出处信息
python以其优美的语法和方便的内置数据结构,赢得了不少程序员的亲睐。
其中有个很有用的数据结构,就是字典(dict),使用非常简单。说到遍历一个dict结构,我想大多数人都会想到 for key in dictobj
的方法,确实这个方法在大多数情况下都是适用的。但是并不是完全安全,请看下面这个例子:
#这里初始化一个dict >>> d = {'a':1, 'b':0, 'c':1, 'd':0} #本意是遍历dict,发现元素的值是0的话,就删掉 >>> for k in d: ... if d[k] == 0: ... del(d[k]) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration #结果抛出异常了,两个0的元素,也只删掉一个。 >>> d {'a': 1, 'c': 1, 'd': 0} >>> d = {'a':1, 'b':0, 'c':1, 'd':0} #d.keys() 是一个下标的数组 >>> d.keys() ['a', 'c', 'b', 'd'] #这样遍历,就没问题了,因为其实其实这里遍历的是d.keys()这个list常量。 >>> for k in d.keys(): ... if d[k] == 0: ... del(d[k]) ... >>> d {'a': 1, 'c': 1} #结果也是对的 >>>
其实,这个例子是我简化过的,我是在一个多线程的程序里发现这个问题的,所以,我的建议是:遍历dict的时候,养成使用 for k in d.keys()
的习惯。
不过,如果是多线程的话,这样就绝对安全吗?也不见得:当两个线程都取完d.keys()以后,如果两个线程都去删同一个key的话,先删的会成功,后删的那个肯定会报 KeyError ,这个看来只能通过其他方式来保证了。
建议继续学习:
- 配置Nginx+uwsgi更方便地部署python应用 (阅读:105382)
- 如何成为Python高手 (阅读:53378)
- python实现自动登录discuz论坛 (阅读:31575)
- 每个程序员都应该学习使用Python或Ruby (阅读:16250)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (阅读:12094)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:12110)
- 我的PHP,Python和Ruby之路 (阅读:11826)
- Python处理MP3的歌词和图片 (阅读:8311)
- 关于使用python开发web应用的几个库总结 (阅读:7425)
- 为什么python里要 if __name__ == ‘__main__’: (阅读:7202)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:IMDB评分排名算法
后一篇:多重继承及虚继承中对象内存的分布 >>
文章信息
- 作者:bones7456 来源: I am LAZY bones ?
- 标签: dict python 遍历
- 发布时间:2010-09-28 09:30:58
建议继续学习
近3天十大热文
- [65] Oracle MTS模式下 进程地址与会话信
- [65] Go Reflect 性能
- [64] 如何拿下简短的域名
- [59] android 开发入门
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则