我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

Python中变量乘以n个的坑

在 Python 中,如果要生成一个全是0的列表,并且这个列表的长度为100,可以使用如下操作: a = [0] * 100 就生成了,效果和 a = [0 for _ in range(100)] 一样。

在某次需要生成二维数组的时候,奇怪的事情发生了,写一道题总是过不了。检查了好几遍,最终定位到问题在于 [[0]* n]* n

其实从表面上看 [[0] *n ]* n[[0]*n for _ in range(n)] 是一样的,但是当你改变某个位置的值的时候,却发现 后面生成的只会改变哪一个位置的值, 而前者会改变每一列的值。究其原因,发现前者生成出来的列表其实都是第一个的引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# coding:utf8

n = 10

a = [[0] * n] * n

b = [[0] * n for _ in range(n)]

a[0][0] = 1

b[0][0] = 1

print(a)

print(b)

执行结果:

[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]