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

  • 本文关键字:切片 变化 golang 追加 函数 2D 创建 go
  • 更新时间 :
  • 英文 :


这是我的代码:

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}

发生了什么。

问题是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