我的问题是为什么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]
}
答案 0 :(得分:1)
tb1
是对列表的引用。做的时候:
List tb2 = tb1;
您正在复制参考,因此tb2
和tb1
指向相同的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);