当我们想初始化一个多维矩阵用来存储信息时,存在这样两种看起来相同的初始化赋值方式:

my_board = [[""] * 8] * 8
my_board[0][0] = "♜"
print(my_board)
for item in my_board:
    print(id(item))

my_board = [["" for _ in range(8)] for _ in range(8)]
my_board[0][0] = "♜"
print(my_board)
for item in my_board:
    print(id(item))

看起来是一样的意思,但实际上结果却完全不同,这里我们输出一下他们的id结果:

[['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', ''], ['♜', '', '', '', '', '', '', '']]
140023830660296
140023830660296
140023830660296
140023830660296
140023830660296
140023830660296
140023830660296
140023830660296
[['♜', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', '']]
140023830660616
140023830660552
140023830660424
140023830660360
140023830660808
140023830661896
140023830661960
140023830662024

第一段代码出来的结果是第一层里的所有元素的id都一样,所以其实是只创建一个list对象,然后将这个对象出入8次。所以其实每个元素都是引用着同一个对象。当相同id的时候,改变my_board[0][0]的内容,就影响到其余的元素(其他元素也跟着一起改变)。