python初始化多维列表的坑

问题

我们知道有两种方式可以初始化一个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)]

你可能感兴趣的:(Python随笔,python)