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

问题描述 投票:0回答:1

这是我的代码:

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}我调试它。发现:

[计算集合[22]时,集合[15]从[] int {1,2,3,4}更改为[] int {1,2,3,5}

发生了什么。

go
1个回答
0
投票

问题是sets类的元素引用同一切片。

您最好为sets的每个元素创建一个新切片。追加不会创建新的切片。

这里是一个修复程序,它复制sets的先前向量而不是简单地对其进行扩展。

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([]int(nil), v...) // t is copy of v
            t = append(t, nums[i])
            sets = append(sets, t)
        }
    }
    return sets
}

在这里测试:https://play.golang.org/p/OZ9nN_t3w9D

© www.soinside.com 2019 - 2024. All rights reserved.