当你制作一个迭代器的(浅)副本时,它会返回一个新的迭代器。
from copy import copy
data = [1, 2, 3, 4]
iter1 = iter(data)
iter2 = copy(iter1)
[i for i in iter1] #[1, 2, 3, 4]
[i for i in iter2] #[1, 2, 3, 4]当您对使用itertools创建的迭代器进行浅层复制时,它将返回相同的迭代器,但深度复制将返回一个新的迭代器。
from copy import copy, deepcopy
from itertools import takewhile
data = [1, 2, 3, 4]
iter1 = takewhile(lambda x: x < 5, data)
iter2 = copy(iter1)
iter3 = deepcopy(iter1)
[i for i in iter1] #[1, 2, 3, 4]
[i for i in iter2] #[] because it's the same iterator
[i for i in iter3] #[1, 2, 3, 4]这是预期的行为吗?在文档中我找不到任何关于复制迭代器的信息。我知道有一个itertools.tee()函数,但它的可用性是有限的(例如,当我们遍历一个不断变化的集合时)。
发布于 2019-11-13 14:14:14
这是已知的行为。
他们指出,“在用户编码的迭代器类型中单独迭代copy.copy的‘支持’几乎总是‘偶然’的……只有在实现中存在某些条件时,副本才能相对于原始版本独立迭代。”
他们决定不采用那个PEP。
https://stackoverflow.com/questions/58830799
复制相似问题