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

OCaml二维数组赋值异常:为何修改单元素影响所有子数组?

OCaml二维数组赋值异常原因及解决方法

问题复现

你写出的代码如下:

let a = Array.make 5 (Array.make 5 0);;
a.(0).(0) <- 4;

执行后发现所有子数组的第0位都变成了4,而非仅a.(0).(0)。

原因分析

核心问题出在Array.make的行为上:

  • Array.make n v会创建一个长度为n的数组,所有元素都指向同一个值v的引用。
  • 这里外层Array.make 5 (...)的第二个参数是Array.make 5 0生成的单个内层数组实例,所以外层数组的5个元素全是这个内层数组的引用,相当于5个变量指向同一块内存。
  • 修改a.(0).(0)本质是修改这个共享内层数组的第0位,因此所有外层数组元素对应的子数组都会显示这个变化。

解决方法

要创建每个子数组独立的二维数组,需使用Array.init替代外层的Array.make:

let a = Array.init 5 (fun _ -> Array.make 5 0);;
a.(0).(0) <- 4;
  • Array.init n f会为每个索引(0到n-1)单独调用一次函数f,每次调用Array.make 5 0都会生成一个全新的内层数组实例,确保所有子数组互相独立。
  • 此时修改a.(0).(0)只会改变第一个子数组的第0位,其他子数组不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:55:20