python - 在 python 中深度复制生成器

标签 python generator

我正在使用生成器函数,例如:

def foo():
    i=0
    while (i<10):
         i+=1
         yield i

现在,我想要在任意次数的迭代后复制生成器的选项,这样新副本将保留内部状态(在示例中将具有相同的“i”)但现在将独立于原始副本(即遍历副本不应更改原始文件)。

我试过使用 copy.deepcopy 但我得到了错误:

 "TypeError: object.__new__(generator) is not safe, use generator.__new__()"   

显然,我可以使用带计数器的常规函数​​来解决这个问题。 但我真的在寻找使用生成器的解决方案。

最佳答案

我能想到的三种情况:

  • Generator 没有副作用,您只希望能够返回已经捕获的结果。你可以考虑 cached generator而不是真正的发电机。您也可以共享缓存的生成器,如果任何客户端走到您还没有去过的项目,它就会前进。这类似于 tee() 方法,但在生成器/缓存本身中执行 tee 功能,而不是要求客户端执行此操作。

  • Generator 有副作用,但没有历史记录,您希望能够在任何地方重新启动。考虑把它写成 coroutine ,您可以在其中随时传入值以启动。

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

关于python - 在 python 中深度复制生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21315207/

相关文章:

c++ - 猜谜游戏的随机生成器

java - Jackson 生成意外的 "new"字段

python - 在 Python 中将列表对转换为键值对

Python:如何在 float 中打印 100.0 而不是 100

python - 在 NumPy 中跟踪多索引和修改值

编写列表列表的 Python csv 文件

generator - 有推荐的接受 Markdown 文档的静态站点生成器吗?

python - 是否可以恢复迭代器并可以分配其值/状态?

JavaScript 生成器及其原型(prototype)链

python - Jenkins Python API 和多配置项目