gpt4 book ai didi

python - 生成器方法、深度复制和复制

转载 作者:行者123 更新时间:2023-12-01 06:09:58 24 4
gpt4 key购买 nike

我试图避免在自定义类(图形类)中使用深度复制

图具有很少的属性,例如顶点、边等,以及一些生成器方法(具有 yield 的方法)。

我需要复制图表:例如H = deepcopy(G) 但不使用 Deepcopy 来加速程序。

然后:

  • 如果我不使用deepcopy那么新图中的生成器方法 H不获取当前状态图 G 中的生成器方法。

  • 如果我不使用生成器方法并且选择使用完整列表生成器,那么我会浪费计算时间没有做任何有用的事情。

解决方案是尝试深度复制一些特定的生成器方法,但我收到错误。

生成器似乎保存了对例如的引用G 的顶点和边,然后当深度复制到 H 时,H 中的生成器仍然引用 G 的属性>(这听起来合乎逻辑)。

那么,我是否注定要使用 deepcopy 还是不使用生成器方法?

还有第三种Pythonic方式吗?

最佳答案

我很确定我明白你的意思。这是一个简单的例子:

class Graph:
def __init__(self, nodes):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes)

G = Graph([1, 2, 3, 4])
print G.nodegen.next()
H = G.copy()
print H.nodegen.next()
print G.nodegen.next()

现在当然会打印 1 1 2。但是,您希望 H.nodegen 记住 G.nodegen 的状态,以便对 H.nodegen.next() 的调用打印2.一个简单的方法是使它们成为同一个对象:

class Graph:
def __init__(self, nodes, nodegen=None):
self.nodes = list(nodes)
self.nodegen = self.iternodes() if nodegen is None else nodegen
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes, self.nodegen)

这将打印 1 2 3,因为调用 H.nodegen.next() 也会推进 G.nodegen。如果这不是你想要的,我认为保留一个内部计数器似乎很好,如下所示:

class Graph:
def __init__(self, nodes, jnode=0):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
self.jnode = jnode
def iternodes(self):
while self.jnode < len(self.nodes):
self.jnode += 1
yield self.nodes[self.jnode-1]
def copy(self):
return Graph(self.nodes, self.jnode)

这将打印 1 2 2,我怀疑这就是你想要的。当然,您必须更改处理诸如在更改 self.nodes 时使迭代器无效之类的事情的方式,但我认为这应该相当简单。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com