【 在 useCASE 的大作中提到: 】
: letter=['A','B','C','D','D','D']
: for i in letter:
: if i=='D':
: ...................
要回答这个问题, 首先, 要解决几个知识点。
1, for in 是什么,
它的伪代码相当于, it = letter.__iter__()
while(it.__next__())
{
}
?iter()方法?:
每个可迭代对象都有一个__iter__()方法,这个方法返回一个迭代器对象。在for循环开始时,__iter__()被调用一次,返回一个迭代器对象,这个迭代器对象必须实现__next__()方法。
如果一个类想要支持for循环,它需要定义一个__iter__()方法,该方法返回该类的实例(自身)或者一个实现了__next__()方法的对象。
?next()方法?:
迭代器对象必须有一个__next__()方法,这个方法用于获取迭代器的下一个元素。每次调用__next__(),都会返回迭代器的下一个元素。当没有更多元素时,__next__()应引发StopIteration异常,这样for循环才能知道何时停止。
在for循环中,每次迭代都会自动调用__next__()来获取下一个元素,直到引发StopIteration异常为止。
2, List是什么, 底层实际上是一个链表, 那么, 迭代器对象实际上就是一个类似链表指针或游标的东西。
因此, 第一次遇到循环遇到d, 那么迭代器当前, 指向第一个d, next指向第二个d的位置,
但是, 你后面调用了remove, 这个相当于链表的删除节点, 也就是后面的节点都向前移动了,如果是游标的话, 显然,已经跳过了一个节点,指向了第三个d, 循环只是做了1,3 两次。
这个的启示就是, 不要在List循环过程里面, 插入,删除List数据节点, 行为可能会不可预料。
--
FROM 115.171.154.*