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)
输出结果
可以看到,在第一种方式中,修改一个子列表的元素会影响到其他所有子列表,而在第二种方式中,每个子列表是独立的,修改一个子列表不会影响其他子列表。通常情况下,建议使用第二种方式来创建独立的二维列表。