如何解决生成器方法,进行深度复制和复制
| 我试图避免在自定义类(Graph类)中使用Deepcopy 图具有很少的属性,例如顶点,边线等,并且具有多种生成器方法(with0ѭ的方法)。 我需要复制图表:例如H = deepcopy(G)
,但不使用Deepcopy来加快程序速度。
然后:
如果我不使用deepcopy
,则
新图ѭ3中的生成器方法
不获取当前状态
图G
中的生成器方法。
如果我不使用生成器方法和
选择使用完整列表生成器,
那我会浪费计算时间
无所事事。
解决的办法是尝试将某些特定的生成器方法加2倍,但出现错误。
似乎生成器将引用保存到例如G
的顶点和边,然后深复制到H
时,H
中的生成器仍然引用ѭ4this的属性(这听起来很合逻辑)。
那么,我是否应该谴责使用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()
也会使ѭ14advance前进。如果那不是您想要的,那么对我来说,保留一个内部计数器似乎很好,就像这样:
class Graph:
def __init__(self,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
时,您将不得不改变对迭代器无效之类的处理方式,但是我认为这应该非常简单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。