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

Dart中使用List.filled创建二维数组出现列表联动问题的原因及解决方法

Dart中使用List.filled创建二维数组出现列表联动问题的原因及解决方法

嗨,我来帮你捋清楚这个问题~

问题原因

你碰到的这个“所有子列表同步变化”的情况,核心是List.filled()这个方法的特性:它的第二个参数是单个对象的引用。当你写List.filled(7, List.filled(15, 0))时,其实是创建了一个包含7个元素的外层列表,但这7个元素全指向同一个长度为15的子列表对象。所以不管你修改哪个索引的子列表,本质都是在操作同一个底层列表,自然所有行都会跟着变啦。

解决方法

要创建真正相互独立的二维数组,得保证每个子列表都是单独的实例,这里有两种常用的实现方式:

方法一:用List.generate()生成独立子列表

List.generate()会为每个索引单独执行生成函数,每次迭代都会创建新的子列表,完美避免引用复用:

List<List<int>> data = List.generate(7, (_) => List.filled(15, 0));

这里的_是占位符参数(我们不需要用到索引值),每次循环都会调用List.filled(15, 0)生成全新的子列表。

方法二:手动循环初始化

如果你更习惯循环的写法,也可以逐个添加独立子列表:

List<List<int>> data = [];
for (int i = 0; i < 7; i++) {
  data.add(List.filled(15, 0));
}

每次循环都新建一个子列表并加入外层列表,同样能保证所有子列表相互独立。

验证效果

修改后的代码执行data[1][0] = 5;后,再打印就会得到你预期的结果:

Index 0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 1: [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 6: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

备注:内容来源于stack exchange,提问作者Geralt von Riva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:14:29