List.removeRange()方法为何影响其他变量?附Dart代码示例
为什么调用
data.removeRange()会影响copydata变量? 嘿,这个问题其实是Dart里列表赋值的一个典型误区,我来给你掰扯清楚其中的原理:
核心原因:列表赋值是引用传递,而非值复制
在你的代码里,这一行是关键:
copydata = data;
你可能以为这行代码会把data列表的内容完整复制一份给copydata,但实际上,它只是让copydata这个变量指向了和data完全相同的列表对象。打个比方:data是一个房间的门牌号,你把这个门牌号复制了一份给copydata,现在两个门牌号都指向同一个房间——不管你用哪个门牌号进去修改房间里的东西,另一个门牌号对应的房间也会跟着变。
所以当你调用data.removeRange(0, data.length - lengthdata)时,你是在直接修改这个唯一的列表对象,copydata作为指向同一个对象的变量,自然会同步看到修改后的结果。
如何真正复制列表,避免这种影响?
如果你想让copydata成为一个独立的新列表,修改原列表不会影响它,可以用以下几种常用方式:
- 使用
List.from()构造函数:copydata = List.from(data); - 使用展开运算符
...(Dart 2.3及以上版本支持):copydata = [...data]; - 调用列表的
toList()方法:copydata = data.toList();
用上面任意一种方式替换copydata = data;后,再运行代码,你会发现copydata的长度会保持60,而data的长度变为50——因为现在它们是两个完全独立的列表对象了。
验证修改后的代码
修改后的完整代码示例:
void main() { int lengthdata = 50; List<double> data = List.filled(lengthdata,0.0,growable: true); List<double> copydata; for (int i = 0; i < 10;i++) { data.add(0.0); } // 改用真正的复制方式 copydata = [...data]; print(copydata.length); // 输出60 print(data.length); // 输出60 data.removeRange(0, data.length - lengthdata); print(copydata.length); // 输出60(不再变化) print(data.length); // 输出50 }
内容的提问来源于stack exchange,提问作者StrangeGirlMurph
相关产品推荐
相关产品推荐

