我只是偶然发现或多或少(回答this问题),人们可以至少一些迭代器使用copy.copy()
复制(不发球)迭代器:这是一个功能或“实施细节”
Q复制:由于这在module documentation中根本没有提及,所以我想知道这是官方功能还是可能在不通知的情况下从语言中删除的内容。
补充问:请问itertools.tee
存在的相同注意事项适用于此处吗?即可能会消耗大量内存,可能会更有效地创建列表。
这是为什么这在我看来,一个非常有用的功能的例子(尝试做同样与tee
):
def triu_indices(n):
"""indices into the upper triangle of a square matrix"""
yi = iter(range(n))
for y in yi:
for x in copy.copy(yi):
yield y, x
for y, x in triu_indices(4):
print(y, x)
# 0 1
# 0 2
# 0 3
# 1 2
# 1 3
# 2 3
更新:我不好,我应该已经明确表示,这也适用于“适当的”迭代器(我测试了itertools.product
和itertools.combinations
)不仅适用于“不是真的迭代器”range
。它也适用于list
迭代器。它确实不是使用文件(_io.TextIOWrapper
)对象。
@mgilson,BrenBarn,谢谢你的回答。他们似乎相容,这总是让人放心。只是为了让我看清楚这一点;你是否说它基本上归结为可拣性?那些需要缓冲的迭代器通常不被支持?如果你没有注意到我已经用迭代器更新了这个问题(以及我已经检查过的迭代器)。 –
@PaulPanzer:我在我的回答中添加了一些注释。基本上,能够复制一个迭代器与复制其他任何东西没有什么不同:如果它定义了复制自己的方法,则可以复制它,否则不能。看起来你发现了一些可以被复制的迭代器,但是并没有真正说出是否可以复制一般的迭代器。此外,迭代器通常依赖于“私有”内部状态,因此遇到的随机迭代器可能比您遇到的其他随机对象更难以复制。 – BrenBarn