热门帖子

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中遇到的问题,其它语言也存在。

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

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

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

2011年4月24日星期日

对Python列表操作remove的误解

  最近开发中,自己犯了一些对Python列表操作不熟悉的错误。主要和我没有系统的一气合成的学过Python或没有完整的看过一本Python书有关吧。也就是平时工作中,用到哪了,看到哪。
  下面先说下,我的问题,熟悉的人不要笑话哈。
  学过Python的人应该都知道列表操作中,删除列表中某个元素,有两种方法:remove、pop。可能一般我们用到remove的会多一点,因为我们一般更多的只是做删除列表中的某个元素这个操作,很少会删除到这个元素后,还要得到这个元素,起码我的开发工作中,好像到现在还没有这种需求吧。
  但就是这么简单的操作,我还是犯错了。是这样的,我的工作中会要用到游戏中所有好友的列表,并对这些列表进行操作,但是这些列表中可能会包含自己的ID,所以我会判断删除自己的ID,我就做了如下可笑的操作:temp_list = all_friend_list.remove(self.uid),然后我就得到了temp_list,并对它进行了剩下的操作。。。。。。
  大家看到了吧,够低级的错误吧。列表的remove操作是没有返回值的,那样的操作肯定不行,temp_list肯定是None了。
  写这篇文章,就是想记录一下自己的错误,让自己回头也笑笑自己,一笑而过嘛。再来就是,通过总结这个错误,对我提出了更高的要求,对Python的基础知识,应该熟记于心,还是应该系统的学习一下Python的所有基础知识,因为,我们开发中,其实大多数用到的还是基础知识。虽然,我有过Java的基础,它们也很相似,但还是应该系统学习学习,就当是复习也好。
  态度决定一切。细心,可能是我现在最应该磨练的。

2011年4月18日星期一

wtools之初体验

今天在网上发现一个不错的网站:http://wtools.cn。大家可以在上面建立自己的任务和计划,并可以对其进行跟踪,感觉还行。也试着创建了一个学习任务。

如果觉得可以,大家也可以去尝试一下。

2011年3月28日星期一

第一弹

这是我的第一个专门个人博客。谢谢大家。请多支持。

这里以后会记录我的每一个学习过程。