非破坏性复制列表

0 投票
4 回答
1397 浏览
提问于 2025-04-18 02:45

我该如何使用 b = a[:] 来创建一个不改变原列表的副本呢?

4 个回答

0

虽然其他人的回答在深拷贝和浅拷贝的语义上讲得更好,但我想说的是,通常来说,使用下面这种写法更好:

a = list(b)

而不是

a = b[:]

因为这样写会更清楚一些。

0

我已经让它工作了,代码如下:

def insert_black_tiles(board, num_black_spaces):
    new_board = board[:]
    while num_black_spaces > 0:
        a = random.randint(0,2)
        b = random.randint(0,2)
        c = 'black'
        if new_board[a][b] != 'black':
            new_board[a][b] = c
            num_black_spaces -= 1
    return new_board

在你的版本中,有时候一个黑色的区域会被再次变成黑色。

补充:这是另一个使用库函数的变体:

def insert_black_tiles(board, num_black_spaces):
    new_board = [x[:] for x in board]
    three_by_three = [(i,j) for i in range(3) for j in range(3)]
    for (a,b) in random.sample(three_by_three, 8):
        new_board[a][b] = 'black'
    return new_board
1

list_[:] 只是复制了第一层的列表,而没有复制里面的第二层列表。

如果你想要复制所有层级的内容,可以使用 copy.deepcopy(list_)。

2

new_board = board[:] 替换成:

new_board = [x[:] for x in board]

board 是一个包含可变列表的列表。board[:] 只是复制了 board 这个列表,但没有复制里面的可变列表。上面的代码可以做到这些复制。

另外,你也可以使用 copy 模块(import copy):

new_board = copy.deepcopy(board)

撰写回答