Python forサイクル失効

3445 ワード

昨日、観察者モードを処理するベースクラスの作業に失敗し、デフォルトの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()
すべてが美しく見える
続けて、s 1、s 2、s 3の3つのsenderがobserversリストにあります.
observers = [s1,s2,s3]
ではremoveAllObserver()を呼び出すと、素晴らしいものが割れてしまいます
forサイクルの実現をよく考えてみると、間違いなく、当てました.反復器を用いたforループは,ループごとに1回の条件の中の__しか得られない.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

出力結果を考えてみてくださいね~
バグの原因は簡単ですが、面白いので、メモしておきます.同じ問題が発生した人を助けてほしいです.
転載先:https://www.cnblogs.com/amaoxiaozhu/p/3160372.html