有人可以向我解释为什么temp的值决定在最后一条输出线上更改,即使temp只是列表数组的副本吗?
func subsets(nums []int) [][]int {
if len(nums) == 0 {
return [][]int{[]int{}}
}
list := [][]int{[]int{nums[0]}}
for _, n := range nums[1:]{
list = append(list, []int{n})
temp := list[:len(list)-1]
fmt.Println(temp)
for _, arr := range temp {
arr = append(arr, n)
list = append(list, arr)
}
fmt.Println(temp)
fmt.Println(" ")
}
list = append(list, []int{})
return list
}
output:
[[1]]
[[1]]
[[1] [2] [1 2]]
[[1] [2] [1 2]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3] [4] [1 4] [2 4] [1 2 4] [3 4] [1 3 4] [2 3 4] [1 2 3 4]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3] [4] [1 4] [2 4] [1 2 4] [3 4] [1 3 4] [2 3 4] [1 2 3 5]]
最佳答案
实际上,您是在复制 slice ,而不是数组。
slice 是数组段的描述符。它由一个指向数组的指针,段的长度及其容量(段的最大长度)组成。
这意味着,您只是在创建slice标题的副本。底层数组仍被共享。
https://blog.golang.org/slices-intro
关于arrays - slice append 的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63475401/