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

为何修改MutableSharedFlow的列表会意外改动原Kotlin列表?

问题解析:修改新列表元素为何会影响原列表?

问题场景

运行基于Compose Multiplatform的代码时,点击“modify list”按钮修改currlist的元素后,原列表Repo.allData也被意外修改;但使用newList[0] = MyData().apply { x=500 }替换元素时,原列表无变化。补充验证显示该问题与Flow无关,核心是引用传递:

println(Repo.allData.map { it.x })
// 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
val mlist = Repo.allData.take(5).toMutableList()
mlist[0].x=500
println(Repo.allData.map { it.x })
// 输出: [500, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1. 为什么原列表会被修改?

Repo.allData.take(5)和后续的toMutableList()确实会生成新的列表容器,但这些新列表中存储的是MyData对象的引用,而非对象本身的副本。也就是说,新列表里的每个MyData元素,和allData中对应元素指向的是内存中的同一个对象。

当执行newList[0].x = 500时,你是通过引用直接修改了这个共享对象的属性值,因此allData中对应的MyData对象的x属性也会同步变化——因为它们本质是同一个对象。

2. 为什么第二种写法无此问题?

当使用newList[0] = MyData().apply { x=500 }时,你创建了一个全新的MyData对象,并将这个新对象的引用赋值给newList的第一个位置。此时newList的第一个元素指向的是新对象,而allData中的第一个元素仍是原来的旧对象,两者不再关联,所以修改新对象的属性不会影响原列表中的对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:35:48