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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:54:00