Python迭代器在执行某些操作后为空
我试图在python3中对codeeval进行挑战,但在尝试改进我的解决方案时遇到了困难。每次我尝试在同一个迭代器上连续迭代(或打印,或其他操作)两次时,第二个循环都是空的。下面是一个产生这种行为的最小示例,尽管我尝试了几种不同的列表组合,但得到了相同的结果:Python迭代器在执行某些操作后为空,python,python-3.x,Python,Python 3.x,我试图在python3中对codeeval进行挑战,但在尝试改进我的解决方案时遇到了困难。每次我尝试在同一个迭代器上连续迭代(或打印,或其他操作)两次时,第二个循环都是空的。下面是一个产生这种行为的最小示例,尽管我尝试了几种不同的列表组合,但得到了相同的结果: numbers = ('1','2','3','4','5') numbers = map(int, numbers) print(l
numbers = ('1','2','3','4','5')
numbers = map(int, numbers)
print(list(numbers))
print(list(numbers))
结果:
[1, 2, 3, 4, 5]
[]
为什么print(在本例中)会删除数字的内容 迭代器就是这样工作的。它们被设计成只在一次飞行中生成数据,而不是更多。如果希望再次从中获取数据,则必须将所有迭代的数据保存到另一个列表中,或者再次启动迭代器。在需要从文件中读取数据或执行其他烦人的操作以重新获取迭代器的情况下,最好在生成数据时将其存储在列表中
>>> numbers = ('1','2','3','4','5')
>>> ints = [x for x in map(int, numbers)]
>>> print(list(ints))
[1, 2, 3, 4, 5]
>>> print(list(ints))
[1, 2, 3, 4, 5]
该协议的目的是一旦迭代器的next()方法
引发StopIteration,它将在后续调用中继续这样做。
不遵守此属性的实现将被视为已损坏。
(这个约束是在Python 2.3中添加的;在Python 2.2中,各种
根据此规则,迭代器被破坏。)
我应该注意到,我在Python2.4.3上运行了与您给出的代码完全相同的代码,并且每次都会打印出列表。所以我想这是一个依赖于版本的东西。这就是迭代器的本质。一旦完成,它将保持完成状态。您只需再次调用
map
函数即可。不过,如果要这样做,最好不要做numbers=map(int,numbers)
。试着给它另一个名字,比如ints=map(int,numbers)
。这样您就不会破坏原始数据。重新启动迭代器的方法是什么?我真的需要为每一张照片绘制地图吗?另外,在我的特定cast(但不是最简单的示例)中,初始列表来自open('file')语句。我也要做两次吗?@Guerki你可能不得不,是的。在这种情况下,您应该迭代数据并将其保存到列表中;这将永久保存数据。我将更新我的答案。@TheSoundDefense:在Python3.x中,许多以前返回列表的函数现在返回迭代器。在本例中,map()。因此,等效的py3k代码是:ints=list(map(int,numbers))
另一件值得注意的事情是,如果您认为不需要迭代整个迭代器,那么这可能会很有帮助,但您可能需要多次迭代到该点。