一个列表附加一个元素,并且列表随着元素的改变而改变?很奇怪

时间:2019-07-11 07:29:40

标签: python list

我试图实现回溯以解决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?不是这个问题的重复。

0 个答案:

没有答案