使用python生成器进行Alpha-beta修剪
我想在python中使用minimax和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
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我不想重新蚀刻任何内容。我说的是你所说的当前迭代。垃圾何时被收集?通常会立即释放,或者在语言本身执行时释放。这就是发电机的优点,它使有效载荷非常小。如果我不需要同时在内存中存储所有项目,我会尽可能多地使用它们。