当我换一张桌子时会影响一张桌子

时间:2020-07-13 14:19:49

标签: dart

我的问题是为什么tb1会更改tb2的值? 我该怎么做,当我更改tb1中的值时,它不会影响tb2

感谢您的帮助

void main() {
  List tb1 = [1, 2, 3, 4];
  print(tb1); //[1, 2, 3, 4]
  List tb2 = tb1;
  print(tb2); // [1, 2, 3, 4]
  tb1[2] = 10;

  print(tb1); //[1, 2, 10, 4]
  print(tb2); //[1, 2, 10, 4]
}

3 个答案:

答案 0 :(得分:1)

tb1是对列表的引用。做的时候:

List tb2 = tb1;

您正在复制参考,因此tb2tb1指向相同的List实例。如果要克隆List,则可以调用.toList()到现有列表:

void main() async {
  List tb1 = [1, 2, 3, 4];
  print(tb1); //[1, 2, 3, 4]
  List tb2 = tb1.toList();
  print(tb2); // [1, 2, 3, 4]
  tb1[2] = 10;

  print(tb1); //[1, 2, 10, 4]
  print(tb2); //[1, 2, 3, 4]
}

tb2现在将指向tb1列表的副本。请注意,List是复制的,而不是列表中的每个元素。在这种情况下,这是没有问题的,因为数字是不可变的,但是如果您具有可以更改内部状态的对象,则需要做出一些逻辑来复制每个对象(如果您不希望两个列表指向同一对象)对象实例)。

我还应该补充一点,您的代码确实存在类型问题,其中您删除了List类型的通用部分。因此,您不用执行List<int>而是使用List,它与List<dynamic>相同。

如果使用完全正确的类型,类型系统可以为您提供很多帮助(因此Dart可以例如确保您的列表仅包含int值),所以我建议您像这样编写代码:

void main() async {
  final tb1 = [1, 2, 3, 4];
  print(tb1); //[1, 2, 3, 4]
  final tb2 = tb1.toList();
  print(tb2); // [1, 2, 3, 4]
  tb1[2] = 10;

  print(tb1); //[1, 2, 10, 4]
  print(tb2); //[1, 2, 3, 4]
}

答案 1 :(得分:0)

我不明白为什么对我不起作用:(

我用我的脚本做

:: enable anaconda environment
set root=C:\ProgramData\Anaconda3
call %root%\Scripts\activate.bat %root%

:: start jupyter
call cd "C:\Users\<USER>\<JUPYTER DOCUMENT ROOT>"
call jupyter notebook

pause

此处为打印结果,您可以看到伦敦更改为假

之前++++++++++++++++++++++++++++++++++

[{{answer:罗马,值:false},{answer:伦敦,值:true},{answer:马赛,值:false}]

AFTER +++++++++++++++++++++++++++++++++

[{{answer:罗马,值:false},{answer:伦敦,值:false},{answer:马赛,值:false}]

答案 2 :(得分:0)

最后我为我找到了一个很好的解决方案

 List tb1 = [1,2,3,4];
 List tb2 = [];
 
 tb2 = List.of(tb1);
 print(tb1);
 print(tb2);

 tb1[2]=10;
 print(tb1);
 print(tb2);

 tb1[0]=12;
 print(tb1);
 print(tb2);