首页 > 解决方案 > 通过 list() 复制一个迭代器

问题描述

我对python中的迭代器有疑问。代码取自一本书,这个例子对我来说有点棘手

it = read_visits('/tmp/my_numbers.txt')
print(list(it))
print(list(it)) # Already exhausted

这里我们有一个错误,因为迭代器已经被第一次打印耗尽

def normalize_copy(numbers):
    numbers = list(numbers) # Copy the iterator
    total = sum(numbers)
    result = []
    for value in numbers:
        percent = 100 * value / total
        result.append(percent)
    return result

it = read_visits(‘/tmp/my_numbers.txt’)
percentages = normalize_copy(it)
print(percentages)

现在这个例子工作正常。我们有迭代器的副本,好的。但是这条线

list(numbers) 

两个示例都相等...为什么第一个示例不起作用?

标签: python

解决方案


这两个示例都没有复制iterator。第一个使用第一个遍历迭代器print——它创建一个列表,打印列表,然后继续。

第二个print也尝试将迭代器产生式转换为列表,但迭代器被第一次list转换耗尽;你得到一个错误。

在第二个示例中,您同样将迭代器内容转换为list. 但是,不是将该列表通过管道传输到 stdout 并丢弃它,而是将该列表保存为 variable numbers。这是一个列表,而不是迭代器。因此,您可以根据 class 的属性多次引用它list

使用迭代器类似于读取文件:一旦您读取了整个文件,另一次读取尝试将失败......直到您以某种方式重置文件描述符。

这是否有助于清除功能?


推荐阅读