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

发布于 2021-01-29 19:33:55

我试图对python3中的codeeval进行挑战,并试图改善我的解决方案。每次我尝试在同一个迭代器上连续两次迭代(或打印或执行其他操作)时,第二个循环为空。这是产生此行为的一个最小示例,尽管我尝试了使用列表等的几种不同组合,但结果却相同:

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

结果是:

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

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

关注者
0
被浏览
40
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这正是迭代器的工作方式。它们被设计为一次只生成一次动态数据,而不再需要一次。如果要第二次获取数据,则必须将所有迭代的数据保存到另一个列表中,或者再次启动迭代器。如果您需要读取文件或做其他烦人的事情来重新获得该迭代器,则最好在生成数据时将其存储在列表中。

    >>> 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上给出的确切代码,并且每次都打印出列表。我想这是与版本有关的事情。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看