You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Dart赋值机制(传值/传引用)的困惑及测试案例求助

Dart赋值机制:按值传递下的类型差异解析

先明确核心结论:Dart确实是按值传递,但这里的「值」分两种情况——原始类型传递的是数据本身,引用类型传递的是对象的内存地址,这就是你看到不同表现的根本原因。

1. 数值类型(int)的独立赋值逻辑

看你第一段测试代码:

var num1 = 12;
var num3 = num1;
print('before: $num3'); // 输出12
num1 = 99;
print('after: ${num3}'); // 仍为12

当执行num3 = num1时,是把num1存储的12这个具体数值完整复制给了num3。此时num1和num3是两个完全独立的变量,各自持有自己的数值。后续修改num1 = 99,只是改变了num1自身的存储值,完全不会影响num3的内容。

2. 列表与自定义类的引用共享逻辑

再看列表相关的测试代码:

List<Person> A1 = [Person('Lucas', 12), Person('Amanda', 12), Person('Zespri', 12)];
List<Person> A2 = A1;
// 修改A1[1].name后,A2同步变化

这里A1存储的不是列表里的Person实例集合,而是这个列表对象在内存中的地址。A2 = A1本质是把这个地址值复制给了A2,所以A1和A2相当于指向同一个列表的两个「快捷方式」。

你修改A1[1].name时,是顺着地址找到列表中的第二个Person实例,修改的是这个实例的属性——既然A2也指向同一个列表,自然能看到这个变化。

如果是直接给A1重新赋值一个新列表(比如A1 = [Person('NewGuy', 20)]),那A2不会跟着变,因为此时A1持有了新列表的地址,而A2仍然指向原来的旧列表。

一句话总结

  • 原始类型(int、String、bool等):赋值时复制数据本身,变量间相互独立。
  • 引用类型(List、自定义类实例等):赋值时复制对象的内存地址,多个变量共享同一个对象;但给变量重新赋值新对象时,不会影响其他变量。

内容的提问来源于stack exchange,提问作者Leong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:23