Arrays F#-在(锯齿状)2d数组中指定元素将设置多个元素

Arrays F#-在(锯齿状)2d数组中指定元素将设置多个元素,arrays,multidimensional-array,f#,Arrays,Multidimensional Array,F#,我在f#中经历了一些我不理解的行为。我试图使用嵌套数组创建一个二维表。子数组将具有相同的长度,因此我可以使用Array2D。但是,稍后我将需要表行作为普通数组,因此为了避免从多维数组转换为常规数组,我希望将表表示为锯齿数组 下面的代码是如何初始化和分配表中元素的示例 let table = Array.create 3 (Array.zeroCreate<int> 2);; table.[0].[0] <- 1;; 为什么表[0].[0]在所有三个子数组中设置第一个元素?我尝

我在f#中经历了一些我不理解的行为。我试图使用嵌套数组创建一个二维表。子数组将具有相同的长度,因此我可以使用Array2D。但是,稍后我将需要表行作为普通数组,因此为了避免从多维数组转换为常规数组,我希望将表表示为锯齿数组

下面的代码是如何初始化和分配表中元素的示例

let table = Array.create 3 (Array.zeroCreate<int> 2);;
table.[0].[0] <- 1;;

为什么
表[0].[0]
在所有三个子数组中设置第一个元素?我尝试使用
System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement
查找子数组的内存地址,在我看来,它们是不同的,因此这三行不是同一个数组。这里发生了什么?

当您使用数组。创建时,它将对象而不是函数作为参数

因此,锯齿状数组的每个元素都是对同一数组的引用,因此可以得到观察到的行为


只需使用非
数组的函数即可。创建
使数组

使用
数组时。创建
将对象而非函数作为参数

因此,锯齿状数组的每个元素都是对同一数组的引用,因此可以得到观察到的行为

只需使用数组以外的函数。创建数组

table;;
val it : int [] [] = [|[|1; 0|]; [|1; 0|]; [|1; 0|]|]