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

Scala中的List是可变还是不可变?用var定义List为何可行?

关于Scala中List不可变性与var变量的疑问

根据Scala官方文档,scala.collection.immutable.List属于不可变集合,其内部结构无法被修改。

但下面这段代码却能正常运行(来源:Udemy平台的Apache Spark with Scala课程):

var numList = List[Int]()
for (num <- 1 to 20) {
  numList = numList ++ List(num)
}

这是否意味着List可以被定义为可变变量?感谢解答!


编辑说明:该问题曾被标记为已解决,指向关于Scala中var和val区别的问题,但我认为这是两个不同的问题。@Mateusz Kubuszok在评论中的回答才是正确的——引用的可变性(var/val)与集合内部结构的可变性是完全独立的两个概念,我希望能将其选为正确答案,但无法操作。


解答

你混淆了两个完全独立的概念:

  • 集合内部的不可变性:Scala的immutable.List本身的结构是不可变的,一旦创建就无法修改它的元素、长度等属性,比如你不能直接给它的某个位置赋值,也不能调用add/remove这类修改内部状态的方法。
  • 变量引用的可变性:var定义的是一个可变的引用,它指向的对象可以被替换。你代码里的操作并不是修改原来的List,而是每次都创建一个新的List(numList ++ List(num)会生成新集合),然后把numList这个变量的引用指向这个新集合。原来的旧List并没有被修改,只是不再被引用了。

简言之:immutable.List是对象本身不可变,而var是变量的引用可变,二者并不冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:35:33