本帖最后由 geen 于 2019-7-16 01:06 编辑
- list1 = ['asd','fgh','mmm','xxx','jkl','jj','kk','pp',1,3,5,7,9.6,4.7,2.8] #增加多个字符串,方便观察总结异常情况的规律。
- print(list1) #插入了检测代码,原列表作为参照对比。
- for each in list1: #结论:在这里修改,把list1改为list1[:],就能正常输出。
- print(each) #插入了检测代码
- if (type(each) != int) and (type(each) != float): #应该用and。
- list1.remove(each)
- print(list1) #插入了检测代码
- print(list1) #插入了检测代码,观察最终列表里有什么?
复制代码
输出结果:
['asd', 'fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
asd (说明:第1个字符串被执行remove())
['fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
mmm (说明:第3个字符串被执行remove())
['fgh', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
jkl (说明:第5个字符串被执行remove())
['fgh', 'xxx', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
kk (说明:第7个字符串被执行remove())
['fgh', 'xxx', 'jj', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
1
3
5
7
9.6
4.7
2.8
['fgh', 'xxx', 'jj', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8] (说明:由于列表里包括字符串和int、float类型,所以无法执行sum()操作。 )
>>>
由输出结果可以得出规律:字符串都是隔了1个才被remove(),造成这个原因:因为被迭代对象list1一边被迭代,一边被修改,当进入下一个循环的时候是新的list1了,但是each已经被执行过一次(迭代了一次),所以在下一个循环的时候执行 [ [新的list1] 的下一个each值],也就得出了间隔一个字符串的结果。做法错误的根本原因就是,不该在循环体内对被迭代对象进行修改操作(即一边迭代,又一边修改)。
查了帮助文档,的确和我猜想的一样,可以用list1[:]切片作为被迭代对象,就能解决问题了。