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
相关产品推荐
相关产品推荐

