IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

python编程细节──遍历dict的两种方法比较

I am LAZY bones ? 2010-09-28 09:30:58 累计浏览 20,297 次
本机暂存

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 ,这个看来只能通过其他方式来保证了。

同分类推荐文章

  1. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  2. 除法的意义 (2026-04-12 20:52:17)
  3. 第五章:共识算法 (2026-03-18 08:00:00)

查看更多 算法 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,186)
  2. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,018)
  3. 程序员技术练级攻略 (累计阅读 35,237)
  4. python实现自动登录discuz论坛 (累计阅读 32,746)
  5. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,836)
  6. Chrome和goagent的配置方法,你懂的 (累计阅读 16,700)
  7. 无锁消息队列 (累计阅读 14,212)
  8. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,675)
  9. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,212)
  10. 我的PHP,Python和Ruby之路 (累计阅读 13,078)