今天在刷LeetCode时,分别使用如下两种方法对列表中的元素进行复制:
distTo1 = [[float('inf') for _ in(range(n))] for _ in range(m)]
distTo2 = [[float('inf')] * n] * m
# [[inf, inf], [inf, inf]]
# [[inf, inf], [inf, inf]]
发现只有第一种方法提交能够通过。
第二种方法无法通过,原因是复制元素共享了内存(列共享),查看其中元素内存地址如下:
print((distTo2)) print(id(distTo2[0][0]), id(distTo2[0][1])) print(id(distTo2[1][0]), id(distTo2[1][1])) # [[inf, inf], [inf, inf]] # 2500138596784 2500138596784 # 2500138596784 2500138596784
修改元素值:
distTo2[0][0]=0
则列表变为如下:
print((distTo2)) print(id(distTo2[0][0]), id(distTo2[0][1])) print(id(distTo2[1][0]), id(distTo2[1][1])) # [[0, inf], [0, inf]] # 140705733490432 2500138596784 # 140705733490432 2500138596784
复制列表元素时,不要轻易使用*号,由此带来的元素变化难以察觉。



