2016-11-14 7 views
2

비정상적인 동작이 발생합니다. 가변 값 배열에 단일 값을 할당하면 전체 열의 값이 변경됩니다.F # 가변 배열 지정

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

가능한 중복 (http://stackoverflow.com/questions/34252606/array-create-and-jagged-array) –

답변

12

는 2 차원 배열 (I 가정으로 예상)을 생성하지 않는 것이 아니라 당신이 정확히 두 개의 배열을 만드는 때문에 발생 : 하나 개의 배열을 5 개 nan의과에서, 또 다른 배열 첫 번째 배열에 대한 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|] 

이 모두 당신에게 동일한 결과를 줄 것이다. 당신이 정말로 2 차원 배열 (이 아니라 배열의 배열)와 함께 작동해야하는 경우

대신 Array2D보고 할 수 있습니다 :

let testArray = Array2D.create 5 5 nan 
testArray.[3,3] <- 1.0 
[Array.create 및 가변 배열]의