为了账号安全,请及时绑定邮箱和手机立即绑定

更改 2D 数组变量也会更改原始 2D 数组变量。为什么?

更改 2D 数组变量也会更改原始 2D 数组变量。为什么?

Go
拉莫斯之舞 2022-09-26 20:06:43
为什么矩阵也发生了变化?Go 变量按值传递或复制,而不是引用,除非使用指针与值显式指定。有什么我不明白的吗?import "fmt"func main() {    matrix := [][]int{        {100, 20, 30, 10, 11},        {15, 100, 16, 4, 2},        {3, 5, 100, 2, 4},        {19, 6, 18, 100, 3},        {16, 4, 7, 16, 100},    }    var matrix2 [][]int    matrix2 = matrix    matrix2[0][1] = 11111111    fmt.Println(matrix)    fmt.Println(matrix2)    // Output :    [[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]    [[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]}
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

Go 切片是对基础数组的引用。切片类似于指向值的指针,而不像直接值。如果使用数组而不是切片,您将看到不同的行为:


package main

import "fmt"


func main() {

    matrix := [5][5]int{

        {100, 20, 30, 10, 11},

        {15, 100, 16, 4, 2},

        {3, 5, 100, 2, 4},

        {19, 6, 18, 100, 3},

        {16, 4, 7, 16, 100},

    }

    var matrix2 [5][5]int

    matrix2 = matrix

    matrix2[0][1] = 11111111

    fmt.Println(matrix)

    fmt.Println(matrix2)

}

输出:


[[100 20 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]

[[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]

你可以看到,因为我使用了数组数组而不是切片,所以赋值复制了整个矩阵。[5][5]int[5]int[][]int[]intmatrix2 = matrix


如果要使用可变大小的矩阵,则必须编写自己的函数来创建矩阵副本。仅当您在编译时知道矩阵的大小(例如 5x5)时,上述代码才有效。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信