即使每个索引和键都是恒定的,打印也会更改值?

Print changes values even though every index and key is constant?

提问人:Tushar Kulkarni 提问时间:3/7/2023 最后编辑:Tushar Kulkarni 更新时间:3/7/2023 访问量:15

问:

void main() {
  var count = 1;
  var a = {};

  exec(selectedOption) {
    if (count == 0) {
      print("NOTHING");
    } else {
      print("ELSE");
      a[1] = {};
      a[1]['values'] = [
        {
          "options": {},
        }
      ];
      a[1]['values'][0]['options'] = selectedOption['options'];
      count = 0;
    }
    print(a[1]['values'][0]['options']['selected']);
  }

  var b = {};
  b['options'] = {};
  b['options']['selected'] = 0;
  exec(b);
  b['options']['selected'] = 1;
  exec(b);
  b['options']['selected'] = 2;
  exec(b);
}

输出

ELSE
0
NOTHING
1
NOTHING
2

为什么 A 的价值会不断变化?首次运行后,不应更改。我是对的还是我不是为编程而生的?我正在使用 flutter 和 dart 2.12。我也尝试使用Javascript,结果相同。

字典 for-loop hashmap nested-lists

评论


答:

0赞 Peter Koltai 3/7/2023 #1

Dart 和 JavaScript 处理地图(对象)的方式相同:按引用而不是按值。

那么,当您在第一次运行时执行此行时会发生什么?

a[1]['values'][0]['options'] = selectedOption['options'];

a[1]['values'][0]['options']将持有对 的引用。而且由于您更改了,因此打印 0、1 和 2 是正常的。b['options']b['options']['selected']

如果要复制 的当前值而不是引用,则需要这样做:b

a[1]['values'][0]['options'] = Map.from(selectedOption['options']);

这将创建另一个映射实例,而不是保存引用,并将生成您预期的结果。

注意:最好不要这样做,因为这是映射中的键,而不是索引为 1 的数组元素。a['1']a[1]