问题
我们知道有两种方式可以初始化一个m*n二维列表:
- 使用*
m, n = 3, 2
x = [[0] * n] * m
- 使用for
y = [[0] * 2 for i in range(3)]
print(x)
print(y)
乍一看, 两者得到的结果是相同的:
[[0, 0], [0, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0]]
实则其中有大坑,我们试着修改下x,y:
x[1][1]=2
y[1][1]=2
print(x)
print(y)
得到如下结果:
[[0, 2], [0, 2], [0, 2]]
[[0, 0], [0, 2], [0, 0]]
坑就在这,方法1得到的多维列表,内层列表其实只有一份拷贝,修改一个就等于修改所有,而方法2内部列表都是独立的个体,修改一个并不会传导到另一个:
x = [[0]*2]*3
y = [[0] * 2 for i in range(3)]
print(*[id(i) for i in x])
print(*[id(i) for i in y])
输出:
2128813329536 2128813329536 2128813329536
2128813351680 2128813351616 2128813351488
结论
为了避免令人迷惑的结果出现, 初始化多维列表时尽量使用:
[[0]*n for i in range(m)]