【发布时间】:2014-05-24 02:49:00
【问题描述】:
如果底层对象在迭代期间发生变化,我想知道迭代器的一般行为是什么。
使用一个简单的可变列表,看起来很明显:迭代器将尝试跟随下一个元素(如果有),如果到达末尾则发送StopIteration。
>>> l = range(10)
>>> a = iter(l)
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> l[3]='a'
>>> a.next()
'a'
>>> a.next()
4
>>> del l[5]
>>> a.next()
6
>>> a.next()
7
>>> a.next()
8
>>> a.next()
9
>>> a.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
到目前为止,这是不言自明的。我不明白的是,如果我追加一个新元素,迭代器仍然会返回StopIteration。
>>> l.append(11)
>>> a.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
如果我在到达终点之前做同样的事情:
>>> l=[1]
>>> a=iter(l)
>>> a.next()
1
>>> l.append(2)
>>> a.next()
2
这在幕后是如何工作的,更复杂的可变可迭代对象的预期行为是什么? (例如,考虑一个表示图的对象,然后可以使用遍历算法对其进行迭代。如果在迭代时添加/删除节点会发生什么?)
【问题讨论】:
-
回答:不要。你问在这些情况下应该发生什么,但实际上你自己也偶然发现了答案:这种行为通常是不明确的。