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

Dart中修改复制的列表为何会同步修改原列表且报并发修改错误?

问题原因
  • 引用赋值未创建新列表:Dart中对象类型的赋值默认传递内存引用,代码中list2 = list1操作并没有生成新的列表副本,只是让list2指向了和list1完全相同的数组实例,所以修改list2本质就是修改原列表list1。
  • 迭代过程并发修改集合:使用for-in语法遍历列表时,Dart禁止在遍历过程中修改被遍历集合的长度,由于list2和list1指向同一实例,遍历list1的同时执行list2.removeLast()会触发并发修改异常。
解决方案

要操作副本不影响原列表,需要先为list2创建list1的独立拷贝(当前列表元素为基础类型,浅拷贝即可满足需求),常见的拷贝方式有三种:

  • 使用展开运算符:list2 = [...list1];
  • 使用List构造方法:list2 = List.from(list1);
  • 使用自带方法:list2 = list1.toList();

修正后的完整代码如下:

void main() 
{
  List<String> list1 = ['jose', 'maria', 'eduardo','emiliano','paula'];
  // 创建list1的独立副本
  List<String> list2 = [...list1];

  for(var name in list1)
  {
    String nameAux = name;
    print(nameAux);
    list2.removeLast();
  }
  // 打印验证结果
  print('原列表内容:$list1');
  print('修改后副本内容:$list2');
}
验证结果

修改后运行代码不会抛出并发修改异常,遍历结束后list1仍保留原始的5个元素,仅list2的元素被删除。


内容的提问来源于stack exchange,提问作者PabloBazan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:45:08