当我使用 golang 的 append 函数创建 2D 切片时,切片中的先前值发生了变化

这是我的代码:


package src


func Subsets(nums []int) [][]int {

    var sets = make([][]int, 0)

    var t = make([]int, 0)

    sets = append(sets, t)

    for i := 0; i < len(nums); i++ {

        for _, v := range sets {

            t = append(v, nums[i])

            sets = append(sets, t)      }

    }

    return sets

}

测试数据是 []int{1,2,3,4,5}

我调试它。发现:


计算sets[22]时,sets[15]从[]int{1,2,3,4}变为[]int{1,2,3,5}


发生了什么。


撒科打诨
浏览 98回答 1
1回答

绝地无双

问题是setskind 的元素引用了同一个 slice。您最好为 的每个元素创建一个新切片sets。追加不会创建新切片。这是一个复制前一个向量sets而不是简单地扩展它的修复程序。package srcfunc Subsets(nums []int) [][]int {&nbsp; &nbsp; var sets = make([][]int, 0)&nbsp; &nbsp; var t = make([]int, 0)&nbsp; &nbsp; sets = append(sets, t)&nbsp; &nbsp; for i := 0; i < len(nums); i++ {&nbsp; &nbsp; &nbsp; &nbsp; for _, v := range sets {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = append([]int(nil), v...) // t is copy of v&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = append(t, nums[i])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sets = append(sets, t)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return sets}在这里测试:https: //play.golang.org/p/OZ9nN_t3w9D
打开App,查看更多内容
随时随地看视频慕课网APP