试图弄清楚这种并行分配是如何工作的。完整代码可在here中找到。 (原始Github python文件)。这是我遇到的问题:

def assign_move(square):

    # Parallel Assignment
    target, direction = max(
        ((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square))
                                if neighbor.owner != myID),
                                default = (None, None),
                                key = lambda t: t[0].production)


我将尽我所能将其分解,但我可能做错了。

target, direction = max(iterable, default, key)


我们是否将目标和方向分配给同一件事?我认为并行分配类似于x, y = 5, 6

现在,如果我们查看iterable,则如下所示:

iterable = ((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square)) if neighbor.owner != myID)


在for循环之前如何拥有(neighbor , direction)?此处的if语句有什么作用?在neighbor.owner != myID的if块下面是否不需要任何内容​​?

如果迭代器为空,我们将返回None, None,如下所示?

default = (None, None),


这就是我们用来确定最大值的函数吗?

key = lambda t: t[0].production)


需要的背景:
这是要在游戏Halite中玩的机器人的代码。这是在此GitHub repo中找到的预建机器人。

最佳答案

这里的max函数返回相对于tuple(direction , neighbors)的最大neighbor.production(据我们从key理解),并且如果neighbor.owner != myID发生以及是否存在迭代器,则允许邻居参与此迭代。为空default = (None, None)将是targetdirections值,因此target是结尾处最多neighborproduction

10-07 18:23