【问题标题】:Error from simply initializing a variable?简单地初始化一个变量会出错?
【发布时间】:2012-07-17 21:34:43
【问题描述】:

在组装 Boggle 求解器时,我遇到了一些奇怪的行为,我希望有人能向我解释。我得到了返回一组可能的单词的函数,而我似乎缺少的只是一种防止求解器包含通过在游戏中访问同一个方块两次而创建的单词的方法。我试图通过迭代用于记忆的全局变量seen(我知道这不正确)来创建当前播放中已经访问过的方块的列表(代表棋盘的字符串中的索引号列表)以前探索过的路径。但是,只需使用以下值初始化一个变量:

previous_ind = [j for (pre, j) in seen]

在递归函数 find_bwords 中,以某种方式影响索引变量 i 并导致源自 find_bwords 中最后一行的 IndexErrors。

seen = set() #(prefix, index) pairs

def boggle_words(board, minlength=3):
    "Find all the words on this Boggle board; return as a set of words."
    results = set()
    for i, sq in enumerate(board):
        if is_letter(sq):
            find_bwords(board, sq, i, results, minlength)
    return results

def find_bwords(board, pre, start, results, minlength): #adds to seen and results
    global seen
    #prev_ind = [j for (pre, j) in seen]  <---mystery culprit
    if (pre, start) not in seen:
        seen.add((pre, start))
        if len(pre) >= minlength and pre in WORDS:
            results.add(pre)
        if pre in PREFIXES:
            for i in neighbors(start, int(sqrt(len(board)))):
                #print 'index: ', i
                find_bwords(board, pre+board[i], i, results, minlength)

这是引入prev_ind之前的部分索引打印输出:

index:  0
index:  1
index:  2
index:  6
index:  8
index:  12
index:  13
index:  14
index:  1
index:  2

这是后面的部分:

index:  0
index:  -7
index:  -14
index:  -21
index:  -28
index:  -35
index:  -42

为什么会这样?

需要明确的是,我不是在寻找解决此任务的方法,而是以另一种方式解决了它,我只是想了解在这种情况下发生了什么。

【问题讨论】:

  • 您可以粘贴异常的回溯吗?理想情况下,您能否提供一个可重现的示例(即板、pre、start 等)?
  • 另外,为什么你在代码中描述的不是previous_ind 行?它在代码中的什么位置?我确定该行实际上并没有影响 i 的值。
  • @DavidRobinson 它在代码中,在 find_bwords 的第 3 行注释掉

标签: python recursion boggle


【解决方案1】:

问题在于您分配给pre 的这一行,覆盖了它之前的值:

prev_ind = [j for (pre, j) in seen]  # <---mystery culprit

尝试将其更改为此,它应该可以按预期工作:

prev_ind = [j for (pre2, j) in seen] 

【讨论】:

  • 领先我两秒,+1。 Python 避免引入新的作用域来提高速度,但有时它可能不直观。
  • 在 Python 3 中已修复:这种意外行为不再发生。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2016-11-25
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多