簡體   English   中英

在python中深度復制生成器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM