使用python生成器进行Alpha-beta修剪

使用python生成器进行Alpha-beta修剪,python,Python,我想在python中使用minimax和alpha-beta修剪来分析一个游戏。伪代码类似于 def alphabeta(node, depth, alpha, beta, isMaxNode): blah blah for each child of node blah blah 在这个特殊的游戏中,计算节点的子节点相当复杂,所以我想定义一个生成器 def children(node): blah blah yield child 然后有 for

我想在python中使用minimax和alpha-beta修剪来分析一个游戏。伪代码类似于

def alphabeta(node, depth, alpha, beta, isMaxNode):
   blah blah
   for each child of node
      blah blah 
在这个特殊的游戏中,计算节点的子节点相当复杂,所以我想定义一个生成器

def children(node):
    blah blah
    yield child
然后有

for child in children(node)
作为上述
for
循环的实现

我担心当阿尔法-贝塔截止发生时会发生什么,因此每个子循环的
中都有一个中断,我们永远无法到达生成器的末尾。关闭会发生什么?它是垃圾收集的,还是会有一堆未解决的闭包占用内存

看来我应该知道这个问题的答案。我认为当中断发生时,闭包超出了范围,并且有资格进行垃圾收集,但我不确定

这与

在这个问题中,生成器没有超出范围,编译器必须读取代码并确定生成器没有被再次调用。然而,在我看来,在我在这个问题中提出的情况下,一旦
for
循环中发生
break
,生成器应该超出范围,并且有资格进行垃圾收集。是这样吗

编辑


再看一遍代码,我意识到一旦alpha-beta截止,函数
alphabeta
不仅会中断
for
循环,还会返回。这使得生成器对象更有可能被垃圾收集,但我对cPython实现的细节一无所知

这回答了你的问题吗@谢谢。请看我如何编辑我的问题。你的问题似乎有点模糊,主要是因为你没有一个例子。一旦一个项目产生,它就不能再蚀刻。内存中唯一存在的东西是函数和当前迭代。如果您希望在数据生成后维护数据,则需要将结果转换为列表,而不是迭代生成。您需要以某种方式将其存储在Forloop中。当使用屈服函数进行forloop时,它是一个且完成的。@fallereneaper我不想重新蚀刻任何内容。我说的是你所说的当前迭代。垃圾何时被收集?通常会立即释放,或者在语言本身执行时释放。这就是发电机的优点,它使有效载荷非常小。如果我不需要同时在内存中存储所有项目,我会尽可能多地使用它们。