Python二维列表for循环赋值后所有行元素重复的原因咨询
Python二维列表for循环赋值后所有行元素重复的原因咨询
嗨,这个问题可是Python新手常踩的经典坑,我来给你把事儿说透~
你遇到的核心问题出在二维列表的创建方式上:
当你写Test=[[0.0]*4]*4的时候,Python并没有为你生成4个独立的子列表,而是先创建了一个[0.0]*4的子列表,然后让外层列表的4个元素全都是这个子列表的引用——说白了,这4行其实是同一个列表的“四个分身”,看起来是四行,本质上指向的是内存里同一个东西。
你可以自己做个小测试,打印每个子列表的内存地址:
Test=[[0.0]*4]*4 print(id(Test[0]), id(Test[1]), id(Test[2]), id(Test[3]))
你会发现四个子列表的id完全一样,这就实锤了它们是同一个对象。所以你在循环里修改Test[r][m]的时候,不管r取0到3里的哪个值,都是在修改那个唯一的子列表,循环跑完后,这个子列表被改了4轮,最后所有“分身”自然都显示最后一轮修改的结果。
那怎么创建真正独立的二维列表呢?用列表推导式就搞定了:
Test = [[0.0]*4 for _ in range(4)]
这种写法里,range(4)的每一次循环都会生成一个全新的[0.0]*4子列表,每个子列表都是独立的内存对象,修改的时候就不会互相干扰了,再跑你的赋值循环,就能得到你预期的结果。
至于numpy的二维数组为啥没问题?因为numpy的数组是真正的二维数据结构,它不是靠引用多个子列表来模拟二维的,而是在内存里开辟了一块连续的二维空间,赋值操作是直接对对应位置的内存单元进行修改,不存在引用共享的问题,所以结果就符合你的预期啦。
备注:内容来源于stack exchange,提问作者Ziggy
相关产品推荐
相关产品推荐

