热门帖子

2011年9月21日星期三

Python字典遍历删除:在错误中加深理解

  好吧。正式开始叙述这个最容易让人遗忘,觉得简单,但又是极容易出错的一个编程常识。

  主人公:遍历字典的同时,删除字典中的项。(如果你使用的语言中有字典)

  我这里就以Python中的字典为例,这也是我开始使用Python起,已经出现过两次这种错误了。

  最近一次出错环境:我字典数据结构大概是这样,d = {'1':{'times':3, 'use':True}, '2':{'times':1, 'use':False}}。这个字典中'times'表示了,某种持续状态,在做了某种操作后,需要对此持续状态减1,并同时删除'times'为0的项,比如d['1']['times']最后减到0了,那么,就需要从d中删除d['1']。我大概就需要做这个操作。类似代码如下:
    def clear_times(d):
        for i in d:
            d['i']['times'] -= 1
            if d['i']['times'] < 1:
                del d['i']

  大家这下明白了吧,一运行这段代码片段,就会报:RuntimeError: dictionary changed size during iteration!

  是呀。这种错,我在第一次遇到时,就出过这个错误,当时也知道了,这个错误是怎么导致的了,就是因为,在遍历字典时,又去改变了正在遍历的这个字典的长度,Python字典发现用户有这种操作时,就会抛出异常。

  当时第一次出现这个错误时,已经记下来,并修改了。但是,没想到自己这次又出现这个错误了。看来自己对字典的操作不是非常熟悉,还是有漏点呀,这种错误可以说是最基础的,这是操作字典的常识,不光是Python中遇到的问题,其它语言也存在。

  所以,今天在网上又搜了一下这种错误,发现了一篇很不错的文章,出处如下:

  这篇文章讲很好,也很全、很透。大家可以好好看看,一定要熟记这些编程常识,不能在编程中再出现这种错误了,可能会因为这种错误,导致出其它更严重的错误,那就得不偿失了。

  也希望这是我最后一次犯这种错了,勤练呀!

没有评论:

发表评论