微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决生成器方法,进行深度复制和复制

| 我试图避免在自定义类(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 举报,一经查实,本站将立刻删除。