对它执行某些操作后,Python迭代器为空

时间:2014-07-30 14:22:47

标签: python python-3.x

我试图在python3中对codeeval进行挑战,并试图改进我的解决方案。每当我试图在同一个迭代器上连续两次迭代(或打印或其他动作)时,第二个循环就会变空。这是一个产生这种行为的最小例子,虽然我尝试了几种不同的组合与列表等,这给了我相同的结果:

numbers = ('1','2','3','4','5')
numbers = map(int, numbers)                                                    
print(list(numbers))                                                          
print(list(numbers))

结果:

[1, 2, 3, 4, 5]
[]

为什么打印(在这种情况下)会删除数字内容?

1 个答案:

答案 0 :(得分:5)

这正是迭代器的工作原理。它们的设计目的只是一次生成数据,而不是更多。如果要再次从中获取数据,则必须将所有迭代数据保存到另一个列表,或者再次启动迭代器。如果您需要从文件中读取或执行其他烦人的事情来重新获取迭代器,那么最好在生成时将这些数据存储在列表中。

>>> 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]

https://docs.python.org/2/library/stdtypes.html#iterator-types

  

协议的意图是迭代器的next()方法   提出StopIteration,它将继续在后续调用中这样做。   不遵守此属性的实现被视为已损坏。   (这个约束是在Python 2.3中添加的;在Python 2.2中是各种各样的   迭代器根据此规则被破坏。)

我应该注意到我运行了你在Python 2.4.3上给出的确切代码,并且每次打印出列表。因此,我认为它是依赖于版本的东西。