[英]deep-copying a generator in python
我正在使用發電機功能,說:
def foo():
i=0
while (i<10):
i+=1
yield i
現在,我希望選擇在任意次數的迭代后復制生成器,以便新副本將保留內部狀態(在示例中將具有相同的“i”),但現在將獨立於原始狀態(即迭代)副本不應該改變原來的)。
我嘗試過使用copy.deepcopy
但是我收到錯誤:
"TypeError: object.__new__(generator) is not safe, use generator.__new__()"
顯然,我可以使用帶有計數器的常規函數來解決這個問題。 但我真的在尋找使用發電機的解決方案。
我能想到三種情況:
生成器沒有副作用,您只希望能夠回顧已經捕獲的結果。 您可以考慮使用緩存的生成器而不是真正的生成器。 您也可以共享緩存的生成器,如果有任何客戶端走到您尚未到達的項目,它將會前進。 這與tee()方法類似,但是在生成器/緩存本身中執行tee功能而不是要求客戶端執行此操作。
Generator有副作用,但沒有歷史記錄,您希望能夠在任何地方重新啟動。 考慮將其寫為協程 ,您可以隨時傳入值。
生成器具有副作用和歷史,這意味着G(x)處的生成器狀態取決於G(x-1)的結果,因此您不能將x傳回其中以從任何地方開始。 在這種情況下,我認為您需要更具體地了解您要執行的操作,因為結果不僅取決於生成器,還取決於其他數據的狀態。 在這種情況下,可能有更好的方法。
itertools.tee
的評論也是我的第一個猜測。 由於警告你不應該在使用T恤后再推進原始發電機,我可能會寫這樣的東西來分拆副本:
>>> from itertools import tee
>>>
>>> def foo():
... i = 0
... while i < 10:
... i += 1
... yield i
...
>>>
>>> it = foo()
>>> it.next()
1
>>> it, other = tee(it)
>>> it.next()
2
>>> other.next()
2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.