Python的嵌套列表就是在列表中包含一个列表,除了手动创建外,可以用乘法
a=[[0]*3]*3
print(a)
#输出结果为:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
这样看起来好像没问题呀,但实际上呢?我们对其中一个元素进行赋值
a=[[0]*3]*3
a[0][0]=1
print(a)
#输出结果为:[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
出乎意料的是,我们原本只想改变一个值,结果更改了3个值,那就说明这种方法创建嵌套列表是出错误的。
出现这样的结果,我们可以猜想是不是把[[0]*3]
作为一个对象进行了复制,指向同一个地址,并没有创建新的列表对象
print(id(a[0]))
print(id(a[1]))
print(id(a[2]))
#输出:
2731945169024
2731945169024
2731945169024
结果输出的值一模一样。事实上,我们把列表直接赋值给另一个列表后,修改其中一个的值,也会出现这样的情况,我们可以借助pythontutor这个网站,来看一下创建过程,附上网站链接(pythontutor)
可以看到与我们猜想的一致,那么该怎么正确创建呢?
a = [[0]*3 for _ in range(3)]
a[0][0]=1
print(a)