gpt4 book ai didi

F# 交错数组赋值

转载 作者:行者123 更新时间:2023-12-01 05:26:54 25 4
gpt4 key购买 nike

我遇到了奇怪的行为 - 当我将单个值分配给锯齿状数组时,它会更改整个列的值。

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|]|]

最佳答案

发生这种情况是因为您没有创建二维数组(正如我假设的那样),而是恰好创建了两个数组:一个包含 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 ,它代替元素采用“创建下一个元素”功能:

let testArray = Array.init 5 (fun _ -> Array.create 5 nan)

或者,您可以使用列表理解来创建数组:

let testArray = [|for i in 1..5 -> Array.create 5 nan|]

两者都会给你相同的结果,尽管第一个的性能稍微好一些。

如果您确实需要使用二维数组(而不是数组的数组),您可能需要查看 Array2D相反:

let testArray = Array2D.create 5 5 nan
testArray.[3,3] <- 1.0

关于F# 交错数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com