Python for 循环 失效

昨天发现一个负责处理观察者模式的基类工作失败,默认的N个观察者负责处理 发送的一些东西,

其中提供一个内置接口移除观察者:

    def removeObserver(self, observer):
        if observer in self.observers:
            self.observers.remove(observer)
            logging.debug('remove %s', observer)
        else:
            logging.error('obj is %s , self obj is ' % (observer, self.observers))
        logging.debug('removed %s finished' % observer)

提供一个外置接口,供管理方移除观察者:

def removeAllObserver(self):
        for ob in self.observers:
            try:
                self.removeObserver(ob)
                logging.debug('Rm %s' % ob)
            except Exception, e:
                logging.error('Rm failed :  %s' % e)

让 observers = [s]

info.removeAllObserver()

这样看起来一切都很美好

继续, s1,s2,s3 三个sender在observers列表中

observers = [s1,s2,s3]

那么当调用 removeAllObserver()时, 美好的东西破碎了

仔细想想for 循环的实现, 没错,猜对了。 用了迭代器的for 循环,每次循环都只会获取一次条件中的__iter__函数来得到next()

def removeKey(src, obj):
    d.remove(obj)

if __name__ == '__main__':
    d = ['a','b','c']
    for each in d:
        removeKey(d,each)
    print d

大家可以想一下输出结果是什么~

bug的原因很简单,但是比较有意思,特此记录一下,希望帮助出现同样问题的人~

posted @ 2013-06-28 10:31  阿毛小猪  阅读(1104)  评论(0编辑  收藏  举报