使用循环的2D数组,输出奇怪吗?

时间:2019-09-27 10:48:13

标签: arrays loops vlang

这是一个非常基本的问题,但是我不知道发生了什么。我期望V中的嵌套for循环可以像C语言和其他语言一样工作。使用以下2个for循环来构建2D数组A,我得到了一个完全疯狂的结果。我究竟做错了什么?

fn main () {
    mut A := [[0].repeat(3)].repeat(4)
    // A = [ [0,1,2], [1,2,3], [2,3,4], [3,4,5] ]
    for i := 0; i < 4; i++ {
        for j := 0 ; j < 3; j++ {
            A[i][j] = i + j
            println( '$i, $j, ${i + j}' )
        }
    }
    for i := 0; i < 4; i++ { println(A[i]) }
}

这是得到什么:

0, 0, 0
0, 1, 1
0, 2, 2
1, 0, 1
1, 1, 2
1, 2, 3
2, 0, 2
2, 1, 3
2, 2, 4
3, 0, 3
3, 1, 4
3, 2, 5
[3, 4, 5]
[3, 4, 5]
[3, 4, 5]
[3, 4, 5]

1 个答案:

答案 0 :(得分:1)

您的数组包含同一行对象的多个副本。修改值时,将对所有行进行修改。为每一行新建一个对象

fn main () {
    mut A := [[0].repeat(3)].repeat(4)
    // A = [ [0,1,2], [1,2,3], [2,3,4], [3,4,5], [4,5,6] ]
    for i := 0; i < 4; i++ {
        A[i] = [0].repeat(3)
        for j :=0 ; j < 3; j++ {
            A[i][j] = i + j
            println( '$i, $j, ${i + j}' )
        }
    }
    for i := 0; i < 4; i++ { println(A[i]) }
}