Dart中shuffle方法表现异常的原因及修复方案咨询
Dart中List.shuffle()修改原数组的原因及修复方案
现象复现
执行以下Dart代码:
var array1 = [1,2,3,4,5]; var array2 = array1; array2.shuffle(); print("array1: $array1"); print("array2: $array2");
输出结果为:
array1: [3, 5, 1, 4, 2] array2: [3, 5, 1, 4, 2]
相同逻辑在Swift中修改array2不会影响array1,核心差异来自两种语言对集合类型的处理机制。
原因分析
Dart中的List是引用类型,执行var array2 = array1;时,并没有创建新的数组对象,只是把array1指向的内存地址赋值给了array2。简单说,array1和array2是同一个数组的两个"别名",调用array2.shuffle()时,实际修改的是它们共同指向的那个数组对象,所以最终打印结果完全一致。
而Swift中的Array是值类型,赋值操作会自动创建原数组的副本,两个变量指向不同的内存对象,修改其中一个自然不会影响另一个。
修复方法
要让array2成为独立数组,只需创建原数组的副本,常用方式有以下几种:
方式1:使用toList()方法
toList()会返回原数组的新副本,修改副本不会影响原数组:
var array1 = [1,2,3,4,5]; var array2 = array1.toList(); // 创建独立副本 array2.shuffle(); print("array1: $array1"); // 输出:array1: [1, 2, 3, 4, 5] print("array2: $array2"); // 输出:array2: [随机打乱后的数组]
方式2:使用扩展运算符...
通过扩展运算符展开原数组元素,快速构造新数组:
var array1 = [1,2,3,4,5]; var array2 = [...array1]; // 展开元素创建新数组 array2.shuffle(); print("array1: $array1"); // 原数组保持不变 print("array2: $array2"); // 副本被打乱
方式3:使用List.from()构造函数
借助List.from()也能生成原数组的独立副本:
var array1 = [1,2,3,4,5]; var array2 = List.from(array1); array2.shuffle(); print("array1: $array1"); print("array2: $array2");
以上三种方式都能让array2脱离原数组的引用关联,调用shuffle()只会修改副本,原数组array1不受影响。
内容的提问来源于stack exchange,提问作者Aizhan Khassenova
相关产品推荐
相关产品推荐

