嵌套列表迭代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
相关产品推荐
相关产品推荐

