提问人:MOHAMMAD RASIM 提问时间:5/31/2023 更新时间:5/31/2023 访问量:13
Dart:更新 List<List<String>> 中的列表也会导致同级列表更新
Dart: updating a list inside a List<List<String>> causes a sibling list to be updated as well
问:
在 Dart 中,如果我有一个多维字符串列表,并且我想将元素添加到内部列表中,它会导致所有列表都具有相同的元素,下面是一个重现该问题的最小示例:
void main(List<String> arguments) {
List<String> teachers = [
'John',
'Chris',
'Michael',
'Eli',
'Jerry',
'Cary',
'Jimmy'
];
List<List<String>> rooms = List.filled(2, <String>[]);
List<String> usedTeachers = List.from(teachers);
for (int roomIndex = 0; roomIndex < rooms.length; roomIndex++) {
rooms[roomIndex].clear();
rooms[roomIndex]
.addAll([usedTeachers.removeAt(0), usedTeachers.removeAt(0)]);
}
print(rooms);
}
我的期望如下:
- 在第一次迭代中,它将从列表中弹出/删除前 2 个元素并将它们添加到第一个列表中,因此它应该具有 ['John','Chris'];
usedTeachers
- 在第二次迭代中,它将从列表中弹出/删除第二个元素,并将它们添加到第二个列表中,因此它应该具有 ['Michael','Eli']
usedTeachers
最终列表应如下所示:rooms
[['John','Chris'],['Michael','Eli']]
相反,它会导致以下结果:
[['Michael','Eli'],['Michael','Eli']]
因此,最终迭代始终会导致所有列表具有相同的元素
看起来像一些通过引用/按值传递的问题,但我在可能的情况下深入克隆列表,所以我不确定问题是什么
我做错了什么?
答:
0赞
MOHAMMAD RASIM
5/31/2023
#1
这似乎是由构造函数引起的,它用相同的元素(相同的内存地址)填充列表,所以当我更新元素时,它会反映在所有列表中
更改线路:List.filled
List<List<String>> rooms = List.filled(2, <String>[]);
对此:
List<List<String>> rooms = List.generate(2, (index) => ['1', '2']);
解决问题
评论