无法理解这种行为的原因:
let example count = let arr = Array.create 2 (Array.zeroCreate count) for i in [0..count - 1] do arr.[0].[i] <- 1 arr.[1].[i] <- 2 arr example 2 |> Array.iter(printfn "%A")
打印:
[|2; 2|] [|2; 2|]
https://dotnetfiddle.net/borMmO
如果我更换:
let arr = Array.create 2 (Array.zeroCreate count)
至:
let arr = Array.init 2 (fun _ -> Array.zeroCreate count)
一切都会按预期工作:
let example count = let arr = Array.init 2 (fun _ -> Array.zeroCreate count) for i in [0..count - 1] do arr.[0].[i] <- 1 arr.[1].[i] <- 2 arr example 2 |> Array.iter(printfn "%A")
打印:
[|1; 1|] [|2; 2|]
https://dotnetfiddle.net/uXmlbn
我认为原因是数组 - 引用类型.但我想知道为什么会这样.因为我没想到会有这样的结果.
当你写:
let arr = Array.create 2 (Array.zeroCreate count)
您正在创建一个数组,其中每个元素都是对同一个数组的引用.这意味着使用变量值arr.[0]
也会改变 - 中的值arr.[1]
- 因为两个数组元素指向同一个可变数组.你最终得到:
[| x ; x |] \ / [| 0; 0 |]
当你写:
let arr = Array.init 2 (fun _ -> Array.zeroCreate count)
为arr
数组中的每个位置调用提供的函数,因此每个元素最终都会有不同的数组(等等arr.[0] <> arr.[1]
).你最终得到:
[| x ; y |] / \ [| 0; 0 |] [| 0; 0 |]