我试图实现回溯以解决n皇后问题,并发现了一个有关list.append()函数的相当混乱的代码问题。
我在Ipython中尝试了一个简单的追加,结果似乎与我从函数中获得的方式不同。
机器:Ubuntu 18.04 LTS x86_64,python 3.6.8
global res
res = []
def solve(queens):
if queens == 0:
return res
else:
positions = [-1] * queens
put_queen(positions, 0, queens)
def put_queen(positions, target_row, queens):
if target_row == queens:
print(positions)
# Confusing part
# res.append([x for x in positions])
res.append(positions)
else:
for i in range(queens):
if check_board(positions, target_row, i):
positions[target_row] = i
put_queen(positions, target_row + 1, queens)
def check_board(positions, target_row, cur_row_pos):
for i in range(target_row):
if positions[i] == cur_row_pos or \
(i - target_row == positions[i] - cur_row_pos) or \
(i - target_row == cur_row_pos - positions[i]):
return False
return True
ss = solve(4)
print(res)
预期答案应为[[1, 3, 0, 2], [2, 0, 3, 1]]
,但它返回[[3, 1, 2, 1], [3, 1, 2, 1]]
。
我检查了每个方差,发现发现[1, 3, 0, 2]
后开始探索新的可能性,一旦方差res
发生变化,方差positions
就会发生变化。
我不知道append(positions)
和append([x for x in positions])
有什么区别。
Ipython脚本结果与上面不同:
In [39]: a
Out[39]: 'd'
In [40]: b = list()
In [41]: b.append(a)
In [42]: b
Out[42]: ['d']
In [43]: a
Out[43]: 'd'
In [44]: a='e'
In [45]: b
Out[45]: ['d']
顺便说一句:我正在做一个追加,而不是副本。 How to clone or copy a list?不是这个问题的重复。