在python中深度复制生成器

2024-05-13 00:14:31 发布

您现在位置: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__()"   

很明显,我可以使用带计数器的常规函数来解决这个问题。 但我真的在寻找一个使用发电机的解决方案。


Tags: 函数示例newobjectfoo状态def错误
2条回答

我能想到三种情况:

  • 生成器没有副作用,您只希望能够遍历已经捕获的结果。您可以考虑使用cached generator而不是真正的生成器。您还可以共享缓存的生成器,如果有任何客户机走向您尚未访问过的项目,它将前进。这类似于tee()方法,但tee功能是在生成器/缓存本身中执行的,而不是要求客户端执行。

  • 生成器有副作用,但没有历史记录,您希望能够在任何地方重新启动。考虑将其作为coroutine编写,在这里您可以随时传入要启动的值。

  • 生成器有副作用和历史记录,这意味着生成器在G(x)处的状态取决于G(x-1)的结果,因此不能只将x传递回它以在任何地方启动。在这种情况下,我认为您需要更具体地说明您要做什么,因为结果不仅取决于生成器,还取决于其他数据的状态。也许,在这种情况下,有更好的方法。

itertools.tee的评论也是我的第一个猜测。由于警告您在使用tee后不应再推进原始生成器,因此我可能会编写如下内容来派生副本:

>>> 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

相关问题 更多 >