我的行为很奇怪 - 当我为锯齿状数组分配单个值时,它会改变整个列的值。
let testArray = Array.create 5 (Array.create 5 nan)
testArray.[3].[3] <- 1.0
上面的代码不是更改单个单元格的值,而是更改整个列的值。
val it : float [] [] =
[|[|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|];
[|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|];
[|nan; nan; nan; 1.0; nan|]|]
答案 0 :(得分:13)
这是因为您没有创建二维数组(正如我所假设的那样),而是您正在创建两个数组:一个数组中包含5个nan
s ,以及另一个数组,其中包含5个对第一个数组的引用。只是为了说明这个问题,下面的代码完全等同于你的代码:
let firstArray = Array.create 5 nan
let testArray = Array.create 5 firstArray
testArray.[3].[3] <- 1.0
因此,行testArray.[3].[3] <- 1.0
实际上只更改了一个元素 - firstArray
中的第四个元素,但如果您尝试打印testArray
,则同一元素会多次显示,因为有firstArray
的多个引用。
如果你想创建一个包含五个不同数组的数组,你需要使用Array.init
,而不是元素采用&#34;创建下一个元素&#34;功能:
let testArray = Array.init 5 (fun _ -> Array.create 5 nan)
或者,您可以使用list comprehension创建数组:
let testArray = [|for i in 1..5 -> Array.create 5 nan|]
两者都会给你相同的结果,不过第一个会有更好的表现。
如果你真的需要使用二维数组(而不是数组数组),你可能想要看一下Array2D
:
let testArray = Array2D.create 5 5 nan
testArray.[3,3] <- 1.0