我很確定我明白你在做什麼。這裏有一個簡單的例子:
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
時,你必須改變如何處理失效迭代器等事情,但我認爲它應該相當簡單。
向我們展示一些(僞)代碼,這太抽象了(至少對我而言)。 – orlp
你不能複製生成器,就這麼簡單。所以這個問題對我來說毫無意義。你想做什麼? –
我也不認爲這個問題沒有意義。如果您想複製所有內容,請使用深層複製。如果您不需要複製所有內容,請告訴您不需要複製的內容。 – rafalotufo