Python二维数组的坑:vis = [[0]*m] * n

先来看,vis = [[0]*m] * n vis2 = [[0]*m for _ in range(n)]有什么区别?

这两行代码都是用来创建二维列表(或矩阵),但它们之间有一个关键的区别在于列表的复制方式。

  • vis = [[0]*m] * n
    这种方式创建了一个包含 n 个相同子列表的列表。也就是说,所有子列表实际上都是同一个列表的引用。如果你修改一个子列表中的元素,其他所有子列表中对应位置的元素也会被修改,因为它们都指向同一个内存位置。

  • vis2 = [[0]*m for _ in range(n)]
    这种方式创建了一个包含 n 个独立子列表的列表。通过列表推导式的方式,每个子列表都是通过 [0]*m 创建的,因此它们在内存中是不同的,互相之间没有关联。

下面是一个例子来说明这两种方式的区别:

n = 3
m = 4

vis = [[0]*m] * n
vis2 = [[0]*m for _ in range(n)]

vis[0][0] = 1
vis2[0][0] = 1

print(vis)
print(vis2)

输出结果
在这里插入图片描述
可以看到,在第一种方式中,修改一个子列表的元素会影响到其他所有子列表,而在第二种方式中,每个子列表是独立的,修改一个子列表不会影响其他子列表。通常情况下,建议使用第二种方式来创建独立的二维列表。