python嵌套列表的坑

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)
这下创建的就没问题了
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容