生成器方法,进行深度复制和复制

| 我试图避免在自定义类(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, 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
时,您将不得不改变对迭代器无效之类的处理方式,但是我认为这应该非常简单。     

要回复问题请先登录注册