You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套列表迭代Bug:两种初始化方法结果不一致的原因排查

为什么两种列表初始化方式结果不同?

嘿,这个问题可是Python新手常踩的经典坑!咱们一步步拆解清楚:

先看两种创建方式的本质区别

方式一:a_good=[[0,0],[0,0]]

这里你手动创建了两个完全独立的子列表,[0,0]和[0,0]是内存里两个不同的对象。所以当你通过双层循环修改每个位置的值时,都是在修改各自对应的子列表元素,最后自然得到预期的[['00','01'],['10','11']]。

方式二:a_error=[[0]*2]*2

这就是问题所在![[0]*2]先创建了一个子列表,然后后面的*2并不是复制出两个新的子列表,而是把同一个子列表的引用重复了两次。也就是说,a_error[0]和a_error[1]指向的是内存中同一个列表对象!

你可以自己验证一下,运行这段代码:

a_error=[[0]*2]*2
print(id(a_error[0]))
print(id(a_error[1]))

会发现两个打印出来的内存地址完全一样,这就实锤了它们是同一个东西。

所以当你循环修改时:

  • 第一次i=0,修改的是这个共享子列表的两个位置,变成['00','01']
  • 第二次i=1,还是在修改同一个共享子列表,把它改成['10','11']
    最后自然两个“子列表”显示的都是最后修改的结果啦。

正确的二维列表创建方式

如果想用简洁的方式创建包含独立子列表的二维列表,推荐用列表推导式:

a_correct = [[0]*2 for _ in range(2)]

这里的for _ in range(2)会循环两次,每次都新建一个[0]*2的子列表,这样每个子列表都是独立的对象,再修改就不会出现同步变化的问题了。

内容的提问来源于stack exchange,提问作者Bernardo Costa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:15:40