Python两种2D列表创建方式修改后输出结果不同的问题求解
问题原因解析
这个差异的核心是两种二维列表创建方式的内存引用逻辑完全不同,表面结构一致但本质完全不同:
1. lst1的创建逻辑
你用的是两层嵌套列表推导式:
lst1 = [[0 for x in range(3)] for x in range(3)]
外层每循环一次,都会重新生成一个全新的[0,0,0]子列表,也就是说lst1里的3个子列表都是独立的内存对象,修改其中任意一个子列表不会影响其他子列表。
你可以用id()函数验证:打印id(lst1[0])、id(lst1[1])、id(lst1[2])会得到三个完全不同的内存地址。
2. lst2的创建逻辑
你用的是乘法复制的方式:
lst2 = [[0]*(3)]*(3)
这里第一步[0]*3会生成第一个[0,0,0]子列表,后续的*3只是把这个子列表的内存引用复制了3份,也就是说lst2里的3个元素本质上都指向同一个子列表对象,修改任意位置的子列表元素,都会同步修改所有3个子列表的对应位置。
你可以用id()函数验证:打印id(lst2[0])、id(lst2[1])、id(lst2[2])会得到三个完全相同的内存地址。
对应运行结果的解释
- 修改
lst1时,只有你遍历到的i=1、i=2对应的独立子列表被修改,i=0的子列表保持初始值[0,0,0],和你看到的输出一致。 - 修改
lst2时,不管你修改的是i=1还是i=2对应的子列表,本质都是改同一个对象,所以最后3个子列表都会变成[0,1,1],和你看到的输出一致。
开发建议
创建嵌套列表时优先选择列表推导式的写法,不要用[子列表]*n的方式生成多维列表,避免出现这种非预期的引用共享问题。
内容的提问来源于stack exchange,提问作者Ashok Kumar
相关产品推荐
相关产品推荐

