我只是偶然發現或多或少(回答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