小弟我今天吃饱了饭逛大神们的blog,发现bones的某篇日志下面这么一段小小的争论。
先摘抄下:
123456789101112131415161718192021222324252627 #这里初始化一个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}#结果也是对的>>>
其实这个问题本来很简单,就是说如果遍历一个字典,但是在遍历中改变了他,比如增删某个元素,就会导致遍历退出,并且抛出一个dic[......]