当前位置:  开发笔记 > Android > 正文

Array.create和锯齿状数组

如何解决《Array.create和锯齿状数组》经验,为你挑选了1个好方法。

无法理解这种行为的原因:

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

我认为原因是数组 - 引用类型.但我想知道为什么会这样.因为我没想到会有这样的结果.



1> Tomas Petric..:

当你写:

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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有