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

为什么修改variants2会改变variants的值?和引用传递有关吗?二者有何区别

运行差异核心原理说明

第一段Map赋值修改同步问题

Dart 中Map属于引用类型:

  • 你定义的variants变量本身并不存储Map的实际键值对数据,只存储堆内存中存放该Map实体的内存地址
  • 执行variants2 = variants时,只是把variants持有的内存地址复制给了variants2,两个变量指向堆内存中的同一个Map对象
  • 后续通过variants2修改Map内部的键值,本质是修改公共内存地址里的内容,所以通过variants读取时也会拿到修改后的结果

这个逻辑和引用传递的规则完全一致,赋值操作仅复制引用地址,不会额外克隆一份完整的Map数据。

第二段double赋值互不影响问题

Dart 中double属于值类型:

  • 你定义的var1变量直接存储5.5这个实际数值,数据存放在栈内存中
  • 执行var2 = var1时,是直接把5.5这个数值完整复制一份,存入var2对应的独立栈内存空间
  • 后续修改var2的数值只是修改它自己对应内存空间的数据,和var1没有关联,所以var1的值不会发生变化

两段代码的核心差异

两种行为的本质是操作的变量类型不同:

  • 引用类型(包括Map、List、自定义类实例等):变量存储的是数据的内存地址,修改地址指向的实际内容会影响所有持有该地址的变量
  • 值类型(包括int、double、bool、String等):变量存储的是实际数据本身,赋值时会复制完整数据,不同变量的修改完全隔离

内容的提问来源于stack exchange,提问作者Ahmed Abd El-Moez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:03