将全局列表附加到全局列表?

时间:2018-05-02 01:38:41

标签: python python-2.7 list backtracking

我已经编写了以下代码来解决n-Queens problem,我们必须找到n n*nn_queens个皇后的所有合法(非攻击)展示位置棋盘。该代码使用标准的回溯解决方案。

此处方法solve_n_queens使用使用递归的辅助方法result。外部方法只是初始化全局列表col_placement& def n_queens(n): def solve_n_queens(row): if row == n: # all queens are legally placed result.append(list(col_placement)) return for col in range(n): # check if new queen is either 1) in same column or 2) same diagonal with any previously placed queen if all(abs(col-c) not in (0, row-r) for r, c in enumerate(col_placement[:row])): col_placement[row] = col solve_n_queens(row+1) result, col_placement = [], [0] * n # result is empty initially; [0] * n means no queen is placed solve_n_queens(0) return result 并调用辅助方法。

n_queens(4)

这会为[[3, 1, 2, 1], [3, 1, 2, 1]]

提供错误的输出
result.append(col_placement)

然而,这不是一个算法错误,因为只是将第4行result.append(list(col_placement))更改为 [[1, 3, 0, 2], [2, 0, 3, 1]] 会神秘地提供正确的输出

col_placement

list已经是list时我不理解,为什么我们需要调用yarn方法?

1 个答案:

答案 0 :(得分:1)

问题在于,如果不使用list,您将附加对您正在使用的相同且唯一的列表col_placement的引用(因为您可以看到结果不仅错误,而且它们也是相同)。使用list会创建一个新副本(col_placement的即时快照),当col_placement继续执行该程序的其余部分时,该副本将不会被修改。

所以基本上list(col_placement)col_placement.copy()col_placement[:]相同。