非破坏性复制列表
我该如何使用 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)